在h标签后找到'p'标签

时间:2014-04-30 09:47:44

标签: python web-scraping beautifulsoup

我想找到从网页中提取标题和段落文本。问题是在标题后面有相同的标题和段落标记,有灵活数量的标题和段落。

示例HTML -

<h6>PHYSICAL DESCRIPTION</h6>

<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>


<h6>SCARS, MARKS, TATTOOS</h6>
<p>     
  &nbsp;    
</p>

我使用的代码如下 -

sub = soup.findAll('h6')
    print sub.text

sub = soup.findAll('p')
for strong_tag in sub.find_all('strong'):
    print strong_tag.text, strong_tag.next_sibling

由于标题中不包含p标记,我不知道如何处理HTML以便编写它。

有没有办法可以像处理文件那样处理HTML并找到下一个h6标签,然后找到下一个p标签并继续执行直到结束?

1 个答案:

答案 0 :(得分:1)

您可以在此处使用Tag.find_next_sibling()

for header in soup.find_all('h6'):
    para = header.find_next_sibling('p')

.find_next_sibling()调用会返回第一个 p标记,该标记是标记标记的下一个兄弟。

演示:

>>> for header in soup.find_all('h6'):
...     print header.text
...     para = header.find_next_sibling('p')
...     for strong_tag in para.find_all('strong'):
...         print strong_tag.text, strong_tag.next_sibling
...     print
... 
PHYSICAL DESCRIPTION
YOB:  1987
RACE:  WHITE
GENDER:  FEMALE
HEIGHT:  5'05''
WEIGHT:  118
EYE COLOR:  GREEN
HAIR COLOR:  BROWN

SCARS, MARKS, TATTOOS

如果当前标头与下一个标头之间没有段落,可以找到错误的<p>标签:

<h6>Foo</h6>
<div>A div, not a p</div>

<h6>Bar</h6>
<p>This <i>is</i> a paragraph</p>

在这种情况下,搜索<p> <h6>代码:

for header in soup.find_all('h6'):
    next_sibling = header.find_next_sibling(['p', 'h6'])
    if next_sibling.name == 'h6':
        # no <p> tag between this header and the next, skip
        continue

header.find_next_sibling(['p', 'h6'])调用将找到下一个段落,下一个标题,以先到者为准。