使用Python在HTML标签中查找数据

时间:2019-01-04 20:08:42

标签: python web-scraping beautifulsoup

我尝试从网站上抓取以下HTML代码:

<td>Net Taxes Due<td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>

我要完成的工作是搜索页面,以在标签内找到文本“ Net Taxes Due”,找到标签的同级并将结果发送到Pandas数据框中。

我有以下代码:

soup = BeautifulSoup(url, "html.parser")
table = soup.select('#Net Taxes Due')

cells = table.find_next_siblings('td')
cells = [ele.text.strip() for ele in cells]

df = pd.DataFrame(np.array(cells))

print(df)

我到网上都在寻找解决方案,却想不出什么办法。感谢任何帮助。

谢谢!

5 个答案:

答案 0 :(得分:1)

在下面,我希望使用索引1和2,但是在使用lxml.html和xpath时2和3似乎可以工作

import requests
from lxml.html import fromstring
# url = ''
# tree = html.fromstring( requests.get(url).content)
h = '''
<td>Net Taxes Due<td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>

'''
tree = fromstring(h)
links = [link.text for link in tree.xpath('//td[text() = "Net Taxes Due"]/following-sibling::td[2] | //td[text() = "Net Taxes Due"]/following-sibling::td[3]' )]
print(links)

答案 1 :(得分:0)

您的.select()呼叫不正确。选择器中的#用于匹配元素的ID,而不是文本内容,因此#Net的意思是使用id="Net"查找元素。选择器中的空格表示查找与每个后续选择器匹配的子代。因此#Net Taxes Due搜索如下内容:

<div id="Net">
    <taxes>
        <due>...</due>
    </taxes>
</div>

要搜索包含特定字符串的元素,请使用.find()string关键字:

table = soup.find(string="Net Taxes Due")

答案 2 :(得分:0)

假定其中包含一个实际的HTML表:

<html>
<table>
<tr>
<td>Net Taxes Due</td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>
</tr>
</table>
</html>

soup = BeautifulSoup(url, "html.parser")
table = soup.find('tr')
df = [x.text for x in table.findAll('td', {'class':'value-column'})]

答案 3 :(得分:0)

确保添加标签名称以及搜索字符串。这样可以做到:

from bs4 import BeautifulSoup

htmldoc = """
<tr>
    <td>Net Taxes Due</td>
    <td class="value-column">$2,370.00</td>
    <td class="value-column">$2,408.00</td>
</tr>
"""    
soup = BeautifulSoup(htmldoc, "html.parser")
item = soup.find('td',text='Net Taxes Due').find_next_sibling("td")
print(item)

答案 4 :(得分:0)

这些应该起作用。如果您使用的是bs4 4.7.0,则“可以”使用select。但是,如果您使用的是旧版本,或者只是喜欢使用find接口,则可以使用它。基本上如上所述,您不能使用#(即ID)引用内容。

import bs4

markup = """
<td>Net Taxes Due</td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>
"""

# Version 4.7.0
soup = bs4.BeautifulSoup(markup, "html.parser")
cells = soup.select('td:contains("Net Taxes Due") ~ td.value-column')
cells = [ele.text.strip() for ele in cells]
print(cells)

# Version < 4.7.0 or if you prefer find
soup = bs4.BeautifulSoup(markup, "html.parser")
cells = soup.find('td', text="Net Taxes Due").find_next_siblings('td')
cells = [ele.text.strip() for ele in cells]
print(cells)

您会得到的

['$2,370.00', '$2,408.00']
['$2,370.00', '$2,408.00']