【发布时间】:2021-03-11 05:48:35
【问题描述】:
请在这里提供一点帮助。这仅供参考。我正在使用 lxml.html 库中的 xpath 方法抓取该站点,以返回包含我需要的元素。我是一个初学者,所以在做了一些研究后,我发现使用 .join、re.、split 等。我可以转换成可读的字符串(我的目标是将所有变量转换成 csv 或 excel)。
所以我的问题是字符串变量 saledate1 和 saleprice1 打印没有问题,但 saledate2 和 saleprice2 没有问题。这里有什么问题我不明白。
这是 HTML 代码:
<TD Align="center" >
<SPAN CLASS = "BodyCopyBold9">
10/10/2012
</SPAN>
</TD>
<TD Align="center" >
<SPAN CLASS = "BodyCopyBold9">
SWD-T
</SPAN>
</TD>
<TD Align="center" >
<SPAN CLASS = "BodyCopyBold9">
$100
</SPAN>
</TD>
<TD Align="center">
<A HREF = "https://officialrecords.broward.org/AcclaimWeb/Details/GetDocumentbyBookPage/O/49164/308">
<SPAN CLASS = "BlueBodyCopyBold9">
49164 / 308
</SPAN>
</A>
</TD>
</TR>
<TD Align="center" >
<SPAN CLASS = "BodyCopyBold9">
10/12/2012
</SPAN>
</TD>
<TD Align="center" >
<SPAN CLASS = "BodyCopyBold9">
SWD-D
</SPAN>
</TD>
<TD Align="center" >
<SPAN CLASS = "BodyCopyBold9">
$400,000
</SPAN>
</TD>
这里是 Python 代码:
import lxml.html
import re
import requests
data = requests.get("https://bcpa.net/RecInfo.asp?URL_Folio=504201170140").content
htmlelement = lxml.html.fromstring(data)
#Sale Date & Price - Row1 - WORKS
saledate1element = htmlelement.xpath("/html/body/table[2]/tr/td/table/tr[1]/td[1]/table[9]/tr/td[1]/table/tr[3]/td[1]/span/text()")
saleprice1element = htmlelement.xpath("/html/body/table[2]/tr/td/table/tr[1]/td[1]/table[9]/tr/td[1]/table/tr[3]/td[3]/span/text()")
saledate1string = ' '.join(map(str, saledate1element))
saledate1 = " ".join(re.split("\s+", saledate1string , flags=re.UNICODE)).strip()
saleprice1string = ' '.join(map(str, saleprice1element))
saleprice1 = " ".join(re.split("\s+", saleprice1string , flags=re.UNICODE)).strip()
print(saledate1)
print(saleprice1)
#Sale Date & Price - Row2 - DOESNT WORK - Empty?
saledate2element = htmlelement.xpath("/html/body/table[2]/tr/td/table/tr[1]/td[1]/table[9]/tr/td[1]/table/tr[4]/td[1]/span/text()")
saleprice2element = htmlelement.xpath("/html/body/table[2]/tr/td/table/tr[1]/td[1]/table[9]/tr/td[1]/table/tr[4]/td[3]/span/text()")
saledate2string = ' '.join(map(str, saledate2element))
saledate2 = " ".join(re.split("\s+", saledate2string , flags=re.UNICODE)).strip()
saleprice2string = ' '.join(map(str, saleprice2element))
saleprice2 = " ".join(re.split("\s+", saleprice2string , flags=re.UNICODE)).strip()
print(saledate2)
print(saleprice2)
结果:
C:\Users\me\PycharmProjects\scrape\venv\Scripts\python.exe C:/Users/me/PycharmProjects/scrape/test.py
10/10/2012
$100
仅供参考,我不得不从 Xpath 中删除 /tbody。似乎浏览器在 Xpath 中填充了这些数据,即使它不在源代码中(我在某处读过这个,不确定这是否 100% 准确,但它有效)。
我们将不胜感激任何能引导我走向正确方向的帮助或信息。谢谢!
最好的,
新手
【问题讨论】:
-
请提供预期的MRE。显示中间结果与预期结果的偏差。我们应该能够将您的代码块粘贴到文件中,运行它并重现您的问题。这也让我们可以在您的上下文中测试任何建议。在那个“神奇”的缩写和操作块中,哪里的值不符合您的预期?
-
我编辑了我的消息以显示点击运行后符合的内容。我得到 saledate1 = "10/10/2012" 和 saleprice1 = "$100" 但对于 saledate2 和 saleprice2 我得到一个空白字符串
标签: python html xpath web-scraping lxml