BeautifulSoup - 如何提取指定字符串后的文本

2024-10-06 07:01:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我的HTML格式如下:

<tr>
    <td>Title:</td>
    <td>Title value</td>
</tr>

我必须指定在这之后<td>和我想要抓取第二个<td>的文本的文本。类似于:抓取<td>之后第一个<td>的文本,其中包含文本Title:。结果应该是:Title value

我对Python和BeutifulSoupno有一些基本的了解,而且我不知道在没有class的情况下如何做到这一点。在

我试过了:

^{pr2}$

我收到错误:AttributeError:'ResultSet' object has no attribute 'nextSibling'


Tags: 文本objecttitlevaluehtml格式错误情况
2条回答

对于使用xpath的lxml,您要做的事情相对容易一些。你可以试试这样的方法

from lxml import etree
tree = etree.parse(<your file>)
path_list = tree.xpath('//<xpath to td>')
for i in range(0, len(path_list)) :
    if path_list[i].text == '<What you want>' and i != len(path_list) :
        your_text = path_list[i+1].text

首先,soup.find_all()返回一个ResultSet,它包含标记为td和字符串为Title:的所有元素。在

对于结果集中的每个这样的元素,您将需要分别获得nextSibling(另外,您应该循环直到找到标记td的nextSibling,因为您可以在这两者之间获得其他元素(比如NavigableString))。在

示例-

>>> from bs4 import BeautifulSoup
>>> s="""<tr>
...     <td>Title:</td>
...     <td>Title value</td>
... </tr>"""
>>> soup = BeautifulSoup(s,'html.parser')
>>> row =  soup.find_all('td', string='Title:')
>>> for r in row:
...     nextSib = r.nextSibling
...     while nextSib.name != 'td' and nextSib is not None:
...             nextSib = nextSib.nextSibling
...     print(nextSib.text)
...
Title value

或者您可以使用另一个支持XPATH的库,使用XPATH可以很容易地做到这一点。其他库如-lxmlxml.etree。在

相关问题 更多 >