![](/img/trans.png)
[英]Extracting text between <br> with beautifulsoup, but without next tag
[英]Extracting content of next and different tag using Beautifulsoup
我想抓取一些特定的 html 代码。
我的蟒蛇代码:
soup = '''
<p>
<strong> abc </strong>
</p>
<ul>
<li> 123 </li>
<li> 456 </li>
</ul>
'''
import bs4
soup = bs4.BeautifulSoup(soup, 'html.parser')
for link in soup.find_all('strong') :
k = link.next_sibling
print (link.text)
print (k)
print (k.text)
和输出:
abc
AttributeError: 'NavigableString' object has no attribute 'text'
如何使用上述标签提取“123”和“456”?
谢谢 。
解决方法有很多,比如可以结合find_next()
和find_next_sibling()
方法:
soup = '''
<p>
<strong> abc </strong>
</p>
<ul>
<li> 123 </li>
<li> 456 </li>
</ul>
'''
import bs4
soup = bs4.BeautifulSoup(soup, 'html.parser')
for link in soup.find_all('strong') :
li1 = link.find_next().li
li2 = li1.find_next_sibling()
print(link.text)
print(li1.text)
print(li2.text)
印刷:
abc
123
456
您需要123
和456
因此您可以使用 :has 和:contains
(bs4 4.7.1+) 来定位具有文本'abc'
子strong
的父p
,然后使用带有类型选择器的相邻同级组合器来获取相邻的ul
; 最后使用带有li
类型选择器的子组合器来获取子li
元素。
from bs4 import BeautifulSoup as bs
html = '''
<p>
<strong> abc </strong>
</p>
<ul>
<li> 123 </li>
<li> 456 </li>
</ul>
'''
soup = bs(html, 'lxml')
print([i.text for i in soup.select('p:has(>strong:contains("abc")) + ul > li')])
from simplified_scrapy.simplified_doc import SimplifiedDoc
html = '''<div><p>
<strong> abc </strong>
</p>
<ul>
<li> 123 </li>
<li> 456 </li>
</ul></div>'''
doc = SimplifiedDoc(html)
s = doc.strong # doc.getElementByTag('strong')
lis = s.parent.next.children
print(s.text)
print(lis[0].text)
print(lis[1].text)
结果:
abc
123
456
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.