时间:2016-11-04 16:01:35

标签: python web-scraping beautifulsoup

如何找到带有跨度的td的下一个td?

html_text = """
<tr class="someClass">
    <td>&nbsp;</td>
    <td>A normal string</td>
    <td class="someClass">10</td>
    <td class="someClass">11</td>
    <td class="someClass">12</td>
    <td>&nbsp;</td>
</tr>
<tr class="someClass">
    <td>&nbsp;</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>&nbsp;</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'))但这也不适用。

这只是两个例子的一个例子,但实际上网站有数百个。

1 个答案:

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