我正在抓取多个具有相似格式的页面,但是它在这里和那里都有一些变化,并且没有可用于搜索我所需要的类的类。
格式如下:
<div id="mainContent">
<p>Some Text I don't want</p>
<p>Some Text I don't want</p>
<p>Some Text I don't want</p>
<span> More text I don't want</span>
<ul>...unordered-list items..</ul>
<p>Text I WANT</p>
<ol>...ordered-list items..</ol>
<p>Text I WANT</p>
<ol>...ordered-list items..</ol>
</div>
有序/无序列表和其他标签的数量根据页面而变化,但是保持不变的是,我始终希望<p>
标签中的文本是该标签的前一个同级<ol>
标签。
我正在尝试(但不起作用)的是:
main = soup.find("div", {"id":"mainContent"})
for d in main.children:
if d.name == 'p' and d.nextSibling.name == 'ol':
print(d.text)
else:
print("fail")
此输出fail
适用于每次迭代。在试图弄清楚为什么它不起作用时,我尝试了:
for d in main.children:
if d.name == 'p':
print(d.nextSibling.name)
else:
print("fail")
这样的输出是这样的:
fail
None
fail
None
fail
None
fail
fail
fail
fail
fail
None
fail
等等...
为什么这不像我想的那样起作用?仅当下一个标记是时,如何才能从<p>
元素中获取文本?<ol>
您只需要p
标签之前的ol
标签。首先找到ol
标签,然后找到先前的Tag对象(在本例中为p
标签)。现在,你的代码是不工作,因为,那里是之间的换行符Tag
被元素NavigableString类型的对象。并为d.nextSibling
您提供那些换行符。因此,您必须在此处检查对象的类型。
from bs4 import Tag
# create soup
# find the ols
ols = soup.find_all('ol')
for ol in ols:
prev = ol.previous_sibling
while(not isinstance(prev, Tag)):
prev = prev.previous_sibling
print(prev.text)
这将为您提供所需的文本。
Text I WANT
Text I WANT
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句