我喜欢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'
答案 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可以轻松完成。其他图书馆包括 - lxml
或xml.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