当用lxml和python抓取一个网站时,是什么解释了这些奇怪的结果?

2024-06-28 19:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

正如标题所说,我只是在胡闹和练习我的python技能,所以我刮这个网站,或尝试太多。直到现在,当我试图刮一个html表时,一切都很顺利。我正在尝试搜索的url是:

https://farm.ewg.org/persondetail.php?custnumber=A09875645&summlevel=whois&dbtouse=2001

我试图在我的代码中得到表中的每个值,包括名称和百分比。我右键单击第一列中所需的前两个值,然后单击inspect。然后我观察到他们的xpath是:

//*[@id="main_content_area"]/div/div/table/tbody/tr[2]/td[1]/a
//*[@id="main_content_area"]/div/div/table/tbody/tr[3]/td[1]/a

好吧,我想,很简单,这只是第二行和第三行的第一列。因此,我设置了以下python代码来尝试检索这些值:

from lxml import html
import requests
testerURL = 'https://farm.ewg.org/persondetail.php?custnumber=A09875645&summlevel=whois&dbtouse=2001'
testerPage = requests.get(testerURL)
testerTree = html.fromstring(testerPage.content)

testerRow1 = testerTree.xpath('//*[@id="main_content_area"]/div/div/table/tbody/tr[2]/td[1]/a/text()')
testerRow2 = testerTree.xpath('//*[@id="main_content_area"]/div/div/table/tbody/tr[3]/td[1]/a/text()')
print(testerRow1)
print(testerRow2)

这将返回以下内容:

['Leitrim Farms, Inc']

[]

我觉得很奇怪,它打印了第一个,但是testerRow2中的第二个似乎是空的。然后,我在python代码中加入了3条print语句:

print(len(testerTree.xpath('//*[@id="main_content_area"]/div/div/table/tbody/tr')))
print(testerTree.xpath('//*[@id="main_content_area"]/div/div/table/tbody/text()'))
print(len(testerTree.xpath('//*[@id="main_content_area"]/div/div/table/tbody/text()')))

返回:

2
['\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n']
17

好吧-这很奇怪。似乎表只有两行-这是错误的-但是解释了为什么我不能在第三行得到值。虽然检查表似乎返回了正确的行数,17,但它们都是空字符串,其中包含换行符-WTF?!你知道吗

有什么想法吗?我以前用python使用过这个过程来刮表,但从未见过这个问题。我有什么特别明显的遗漏吗?我花了4个小时的时间把头撞在键盘上:哦

以下内容:

len(testerTree.xpath('//*[@id="main_content_area"]/div/div/table/tbody/tr'))

真的应该返回17行,而不是2行,返回2的事实让我头痛。你知道吗

更新:一个评论者建议也许信息不是网站上的html的一部分,而是通过js加载的,这就是为什么我无法从html获取信息的原因。我不认为这是正确的,虽然当我手动检查网站的数据似乎硬编码的html,而不是通过js加载。你知道吗


Tags: textdivid网站mainhtmltablearea