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 行,在 if hasattr(node, "attrs") and (' image' in node.attrs['class']): KeyError: 'class' 我明白了,这是指节点没有'class'属性,我想你可以先判断attrs dict是否有class来解决

以上是关于BeautifulSoup - 如何获取两个不同标签之间的所有文本?的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup4模块的使用

我如何从 BeautifulSoup 中获取 CData

BeautifulSoup 使用select方法详解(通过标签名,类名, id,组合,属性查找)

Python - BeautifulSoup - 如何进行在线数据解析

从 BeautifulSoup 4.6 中的两个 HTML 标签之间提取 HTML

Django:如何获取当前 URL 标记名(用于分页)?