使用 BeautifulSoup CSS 选择器获取文本
Posted
技术标签:
【中文标题】使用 BeautifulSoup CSS 选择器获取文本【英文标题】:Get text with BeautifulSoup CSS Selector 【发布时间】:2016-10-18 18:56:49 【问题描述】:示例 html
<h2 id="name">
ABC
<span class="numbers">123</span>
<span class="lower">abc</span>
</h2>
我可以通过以下方式获取数字:
soup.select('#name > span.numbers')[0].text
如何使用 BeautifulSoup 和 select
函数获取文本 ABC
?
在这种情况下呢?
<div id="name">
<div id="numbers">123</div>
ABC
</div>
【问题讨论】:
【参考方案1】:在第一种情况下,获取previous sibling:
soup.select_one('#name > span.numbers').previous_sibling
在第二种情况下,获取next sibling:
soup.select_one('#name > #numbers').next_sibling
请注意,我假设这里有意将numbers
作为id
值,并且标签是div
而不是span
。因此,我调整了 CSS 选择器。
要覆盖这两种情况,你可以去标签的父节点,以非递归方式找到非空文本节点:
parent = soup.select_one('#name > .numbers,#numbers').parent
print(parent.find(text=lambda text: text and text.strip(), recursive=False).strip())
注意选择器的变化 - 我们要求匹配 numbers
id 或 numbers
类。
不过,我觉得这种通用解决方案不太可靠,因为对于初学者来说,我不知道您的实际输入可能是什么。
【讨论】:
是的,id 和 div 与 span 的变化是有意的。感谢您的关注!有没有办法从上一个解决方案中的父母开始,然后在案例#1 中直接选择第一个孩子,或者在案例#2 中选择第二个孩子?我试图避免使用 find 或 findAll。 @slaw 是的,当然,您可以使用contents
列表:tag.contents[0]
或tag.contents[1]
。或者,通过tag.children
生成器。以上是关于使用 BeautifulSoup CSS 选择器获取文本的主要内容,如果未能解决你的问题,请参考以下文章
为什么BeautifulSoup无法解析页面的所有元素? (答案:BeautifulSoup中的CSS选择器)
如何将从 Chrome 复制的 css 选择器路径转换为 beautifulsoup 对象?