2014-04-30 8 views
18

मेरे वेबपेज कुछ इस तरह है -BeautifulSoup बिना टैग पाठ निकालें का उपयोग

<p> 
    <strong class="offender">YOB:</strong> 1987<br /> 
    <strong class="offender">RACE:</strong> WHITE<br /> 
    <strong class="offender">GENDER:</strong> FEMALE<br /> 
    <strong class="offender">HEIGHT:</strong> 5'05''<br /> 
    <strong class="offender">WEIGHT:</strong> 118<br /> 
    <strong class="offender">EYE COLOR:</strong> GREEN<br /> 
    <strong class="offender">HAIR COLOR:</strong> BROWN<br /> 
</p> 

मैं प्रत्येक व्यक्ति के लिए जानकारी निकालने और Yob प्राप्त करना चाहते हैं: 1987, रेस: व्हाइट आदि ....

मैं क्या करने की कोशिश की है -

subc = soup.findAll('p') 
subc1 = subc[1] 
subc2 = subc1.findAll('strong') 

लेकिन यह मुझे YoB :, जाति के ही मान प्रदान करता है :, आदि

क्या कोई तरीका है कि मैं वाईओबी में डेटा प्राप्त कर सकता हूं: 1 9 87, दौड़: सफेद प्रारूप?

धन्यवाद, मनीष

उत्तर

33

बस पाश <strong> टैग्स और आप जो चाहते हैं उसे प्राप्त करने के लिए next_sibling का उपयोग करें। इस तरह:

for strong_tag in soup.find_all('strong'): 
    print strong_tag.text, strong_tag.next_sibling 

डेमो:

>>> from bs4 import BeautifulSoup 
>>> html = ''' 
... <p> 
...  <strong class="offender">YOB:</strong> 1987<br /> 
...  <strong class="offender">RACE:</strong> WHITE<br /> 
...  <strong class="offender">GENDER:</strong> FEMALE<br /> 
...  <strong class="offender">HEIGHT:</strong> 5'05''<br /> 
...  <strong class="offender">WEIGHT:</strong> 118<br /> 
...  <strong class="offender">EYE COLOR:</strong> GREEN<br /> 
...  <strong class="offender">HAIR COLOR:</strong> BROWN<br /> 
... </p> 
... ''' 
>>> soup = BeautifulSoup(html) 
>>> for strong_tag in soup.find_all('strong'): 
...  print strong_tag.text, strong_tag.next_sibling 

यह आपको देता है:

YOB: 1987 
RACE: WHITE 
GENDER: FEMALE 
HEIGHT: 5'05'' 
WEIGHT: 118 
EYE COLOR: GREEN 
HAIR COLOR: BROWN 
14

मुझे लगता है कि आप subc1.text का उपयोग कर इसे प्राप्त कर सकते हैं।

>>> html = """ 
<p> 
    <strong class="offender">YOB:</strong> 1987<br /> 
    <strong class="offender">RACE:</strong> WHITE<br /> 
    <strong class="offender">GENDER:</strong> FEMALE<br /> 
    <strong class="offender">HEIGHT:</strong> 5'05''<br /> 
    <strong class="offender">WEIGHT:</strong> 118<br /> 
    <strong class="offender">EYE COLOR:</strong> GREEN<br /> 
    <strong class="offender">HAIR COLOR:</strong> BROWN<br /> 
</p> 
""" 
>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(html) 
>>> print soup.text 


YOB: 1987 
RACE: WHITE 
GENDER: FEMALE 
HEIGHT: 5'05'' 
WEIGHT: 118 
EYE COLOR: GREEN 
HAIR COLOR: BROWN 

या यदि आप यह पता लगाने करना चाहते हैं, तो आप .contents उपयोग कर सकते हैं:

>>> p = soup.find('p') 
>>> from pprint import pprint 
>>> pprint(p.contents) 
[u'\n', 
<strong class="offender">YOB:</strong>, 
u' 1987', 
<br/>, 
u'\n', 
<strong class="offender">RACE:</strong>, 
u' WHITE', 
<br/>, 
u'\n', 
<strong class="offender">GENDER:</strong>, 
u' FEMALE', 
<br/>, 
u'\n', 
<strong class="offender">HEIGHT:</strong>, 
u" 5'05''", 
<br/>, 
u'\n', 
<strong class="offender">WEIGHT:</strong>, 
u' 118', 
<br/>, 
u'\n', 
<strong class="offender">EYE COLOR:</strong>, 
u' GREEN', 
<br/>, 
u'\n', 
<strong class="offender">HAIR COLOR:</strong>, 
u' BROWN', 
<br/>, 
u'\n'] 

और सूची से आवश्यक वस्तुओं को फ़िल्टर: सभी के माध्यम से

>>> data = dict(zip([x.text for x in p.contents[1::4]], [x.strip() for x in p.contents[2::4]])) 
>>> pprint(data) 
{u'EYE COLOR:': u'GREEN', 
u'GENDER:': u'FEMALE', 
u'HAIR COLOR:': u'BROWN', 
u'HEIGHT:': u"5'05''", 
u'RACE:': u'WHITE', 
u'WEIGHT:': u'118', 
u'YOB:': u'1987'} 
संबंधित मुद्दे