【问题标题】:Returning Blank List返回空白列表
【发布时间】: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
              &nbsp;
             </SPAN>
            </TD>
            <TD Align="center" >
             <SPAN CLASS = "BodyCopyBold9">
              SWD-T
              &nbsp;
             </SPAN>
            </TD>
            <TD Align="center" >
             <SPAN CLASS = "BodyCopyBold9">
              $100
             </SPAN>
             &nbsp;
            </TD>
            
             <TD Align="center">
              <A HREF = "https://officialrecords.broward.org/AcclaimWeb/Details/GetDocumentbyBookPage/O/49164/308">
               <SPAN CLASS = "BlueBodyCopyBold9">
                49164&nbsp;/&nbsp;308
               </SPAN>
              </A>
             </TD>
            
           </TR>
          
            <TD Align="center" >
             <SPAN CLASS = "BodyCopyBold9">
              10/12/2012
              &nbsp;
             </SPAN>
            </TD>
            <TD Align="center" >
             <SPAN CLASS = "BodyCopyBold9">
              SWD-D
              &nbsp;
             </SPAN>
            </TD>
            <TD Align="center" >
             <SPAN CLASS = "BodyCopyBold9">
              $400,000
             </SPAN>
             &nbsp;
            </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


【解决方案1】:

因为有 joined 空列表,所以输出为空字符串,导致空字符串:saledate2elementsaleprice2element 都是空的。您需要使用 lxml.html 方法沿着您正在使用的路径向下工作,以找出它与您认为加载的结构中的不匹配的地方。

【讨论】:

  • 我知道它会导致一个空列表。这就是我写这篇文章并寻求帮助的原因。我正在使用 lxml.html。你看代码了吗?我使用 xpath。
  • 是的,我查看了您的代码;我解释了你提出的问题。如果您知道列表是空的,那应该反映在您的代码中。我要求 MRE 的 SO 标准,包括你在哪里追踪你的路径。你没有这样做。这仍然是 15 个元素的“神奇”路径,没有中间输出。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多