我尝试从网站上抓取以下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)
我到网上都在寻找解决方案,却想不出什么办法。感谢任何帮助。
谢谢!
答案 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']