在h标签后找到'p'标签
我想从一个网页中提取标题和段落的文本。问题是,标题和段落的数量是不固定的,都是用相同的标签来标记的。
示例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>
</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
因为标题中不包含段落标签,所以我不太确定该如何处理这些HTML内容。
有没有办法把HTML当作文件来处理,找到下一个h6标签,然后找到下一个p标签,一直这样做直到结束呢?
1 个回答
4
你可以在这里使用 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'])
方法会找到下一个段落 或者 下一个头部标签,哪个先出现就返回哪个。