python - BeautifulSoup 查找找到的标签后的下一个特定标签

标签 python parsing beautifulsoup

鉴于以下内容(从较大的文档简化)

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

我尝试使用 bs4lxml 从适当的行返回 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_elementnext_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/

相关文章:

python - 无论如何让 BeatifulSoup 4 正确识别 html 4 未标记的自关闭标签?

python - 使用 python 从重定向的标准输入读取输入

python "bad interpreter"错误

python - django按当前用户过滤投票

java - 如何使用 `com.fasterxml.jackson.core.JsonParser` 确定 json 数组的大小

javascript - 当字符串没有协议(protocol)时匹配主机名 ://?

python - 如何使用 matplotlib 设置基线并让条形图向下增长

java - SimpleDateFormat 无法解析日期

python - 从图书馆目录中抓取信息

python - 使用 Python 抓取网页