如何找到带有跨度的td的下一个td?
html_text = """
<tr class="someClass">
<td> </td>
<td>A normal string</td>
<td class="someClass">10</td>
<td class="someClass">11</td>
<td class="someClass">12</td>
<td> </td>
</tr>
<tr class="someClass">
<td> </td>
<td>Non normal string <span style="font-size:10px">(with span)</span></td>
<td class="someClass">2 000</td>
<td class="someClass">2 100</td>
<td class="someClass">2 150</td>
<td> </td>
</tr>
"""
使用&#34;正常字符串&#34;来获取td之后的td。在其中我只是通过以下方式找到它:
a_normal_string = str(soup.find("td", text="A normal string").find_next('td'))
a_normal_string = re.findall(r'\d+', a_normal_string)
print a_normal_string #['10']
然而,在第二个tr我需要在td之后用Non normal string
上面的方法找到td将无效。那么如何处理包含跨度的td呢?
首先想到的是通过正则表达式找到它并编译a_nonnormal_string = str(soup.find("td", text=re.compile(r'A non normal string')).find_next('td'))
但这也不适用。
这只是两个例子的一个例子,但实际上网站有数百个。
答案 0 :(得分:1)
一个选项是使用searching function解决问题,使用get_text()
检查所需字符串的文本(注意get_text()
返回包含其子元素的元素的完整文本元素,但.string
does not - 如果有子元素,它将是None
- 这实际上是你的第二种方法不起作用的原因):
tds = soup.find_all(lambda tag: tag.name == "td" and "normal string" in tag.get_text())
for td in tds:
a_normal_string = td.find_next('td').get_text()
print(a_normal_string)
打印:
10
2 000