BeautifulSoup - 如何获取两个不同标签之间的所有文本?
Posted
技术标签:
【中文标题】BeautifulSoup - 如何获取两个不同标签之间的所有文本?【英文标题】:BeautifulSoup - How to get all text between two different tags? 【发布时间】:2018-01-02 22:55:41 【问题描述】:我想获取两个标签之间的所有文本:
<div class="lead">I DONT WANT this</div>
#many different tags - p, table, h2 including text that I want
<div class="image">...</div>
我是这样开始的:
url = "http://......."
req = urllib.request.Request(url)
source = urllib.request.urlopen(req)
soup = BeautifulSoup(source, 'lxml')
start = soup.find('div', 'class': 'lead')
end = soup.find('div', 'class': 'image')
我不知道下一步该做什么
【问题讨论】:
你可以试试 next_sibling 属性,并使用循环查找节点直到结束一个 我已经看到了很多这样的事情。一个像样的解析器可以做到.lead ~ :has(~ .image)
,但我还没有在 Python 中看到任何可以做到这一点的东西。
【参考方案1】:
试试这个代码,它让解析器从班级开始并在命中班级图像时退出程序并打印所有可用的标签,这可以更改为打印整个代码:
html = u""
for tag in soup.find("div", "class" : "lead" ).next_siblings:
if soup.find("div", "class" : "image" ) == tag:
break
else:
html += unicode(tag)
print html
【讨论】:
不幸的是它并没有停留在 【参考方案2】:尝试使用以下代码:
from bs4 import BeautifulSoup
soup = BeautifulSoup("""
<html><div class="lead">lead</div>data<div class="end"></div></html>"
""", "lxml")
node = soup.find('div', 'class': 'lead')
s = []
while True:
if node is None:
break
node = node.next_sibling
if hasattr(node, "attrs") and ("end" in node.attrs['class'] ):
break
else:
if node is not None:
s.append(node)
print s
使用 next_sibling 获取兄弟节点。
【讨论】:
我收到 KeyError: 'class' - if hasattr(node, "attrs") and ('end' in node.attrs['class'] ) 当然:回溯(最近一次调用最后):文件“........py”,第 406 行,在以上是关于BeautifulSoup - 如何获取两个不同标签之间的所有文本?的主要内容,如果未能解决你的问题,请参考以下文章
BeautifulSoup 使用select方法详解(通过标签名,类名, id,组合,属性查找)
Python - BeautifulSoup - 如何进行在线数据解析