鉴于以下内容(从较大的文档简化)
<tr class="row-class">
<td>Age</td>
<td>16</td>
</tr>
<tr class="row-class">
<td>Height</td>
<td>5.6</td>
</tr>
<tr class="row-class">
<td>Weight</td>
<td>103.4</td>
</tr>
我尝试使用 bs4
和 lxml
从适当的行返回 16
。问题似乎是两个 td
标记之间有一个 Navigable String
,因此
page.find_all("tr", {"class":"row-class"})
产生一个结果集
result[0] = {Tag} <tr class="row-class"> <td>Age</td> <td>16</td> </tr>
result[1] = {Tag} <tr class="row-class"> <td>Height</td> <td>5.6</td> </tr>
result[2] = {Tag} <tr class="row-class"> <td>Weight</td> <td>103.4</td> </tr>
这很棒,但我无法获取第二个td
中的字符串。每行的内容类似于
[' ', <td>Age</td>, ' ', <td>16</td>, ' ']
其中td
是标签
,' '
是可导航字符串
。这种差异阻止我使用 next_element
或 next_sibling
便捷方法来访问正确的文本,例如:
如果我使用:
find("td", text=re.compile(r'Age')).get_text()
我得到了年龄
。但是如果我尝试通过访问下一个元素
find("td", text=re.compile(r'Age')).next_element()
我明白
'NavigableString' object is not callable
由于结果
中包裹了NavigableStrings
,使用previous_element
向后移动也会出现同样的问题。
如何从找到的 Tag
移动到下一个 Tag
,并跳过其间的 next_element
?有没有办法从结果
中删除这些' '
?
我应该指出,我已经尝试过务实的做法,例如:
for r in (sp.find_all("tr", {"class":"row-class"})):
age = r.find("td", text=re.compile(r"\d\d")).get_text()
它有效......直到我解析一个文档,该文档在 Age
之前有另一个匹配 \d\d
的订单。
我也知道我可以
find("td", text=re.compile(r'Age')).next_sibling.next_sibling
但这对结构来说是硬性的。
因此,我需要在搜索中具体查找具有目标字符串的 td
,然后在下一个 td
中查找值。我知道我可以构建一些测试每一行的逻辑,但似乎我缺少一些明显且更优雅的东西......
最佳答案
如果您获取元素列表,则可以使用[index]
从列表中获取元素。
data = """<tr class="row-class">
<td>Age</td>
<td>16</td>
</tr>
<tr class="row-class">
<td>Height</td>
<td>5.6</td>
</tr>
<tr class="row-class">
<td>Weight</td>
<td>103.4</td>
</tr>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(data)
trs = soup.find_all("tr", {"class":"row-class"})
for tr in trs:
tds = tr.find_all("td") # you get list
print('text:', tds[0].get_text()) # get element [0] from list
print('value:', tds[1].get_text()) # get element [1] from list
结果
text: Age
value: 16
text: Height
value: 5.6
text: Weight
value: 103.4
关于python - BeautifulSoup 查找找到的标签后的下一个特定标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35050496/