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

时间:2015-07-26 14:47:16

标签: python python-3.x beautifulsoup extract

我喜欢HTML:

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

我必须指定<td>带文字后我想要抓取第二个<td>的文字。类似于:在<td>之后抓取包含文字<td>的第一个下一个Title:的文字。结果应为:Title value

我对Python和BeutifulSoupno有一些基本的了解,我不知道如果没有class要指定,我该怎么做呢。

我试过这个:

row =  soup.find_all('td', string='Title:')
text = str(row.nextSibling)
print(text)

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

2 个答案:

答案 0 :(得分:4)

首先,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

答案 1 :(得分:0)

使用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