使用 BeautifulSoup CSS 选择器获取文本
Get text with BeautifulSoup CSS Selector
示例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>
第一种情况,得到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
class.
不过,我觉得这个通用解决方案不太可靠,因为对于初学者来说,我不知道您的实际输入是什么。
示例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>
第一种情况,得到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
class.
不过,我觉得这个通用解决方案不太可靠,因为对于初学者来说,我不知道您的实际输入是什么。