python scrapy - 从 <table> 中提取数据 - 没有 id 标签

Posted

技术标签:

【中文标题】python scrapy - 从 <table> 中提取数据 - 没有 id 标签【英文标题】:python scrapy - extract data from <table> - no id tag 【发布时间】:2018-07-15 18:54:41 【问题描述】:

我对 Python 和 Scrapy 还很陌生,这就是我创建一个项目供自己学习它的原因。但目前我正在努力从以下页面获取数据:Website to crawl

正如我在 Chrome/Firefox 的“开发人员工具”中看到的那样,有 8 个表的类如下:&lt;table class="sc-fHxwqH ddWfJE"&gt;

在这张图片structure and table I'd like to extract 中,您可以看到我想要提取的结构和列 (&lt;td&gt;),其中值为 = "Wheelchair Access"。该值在第二列中,它是一个图片标签。 它是这样读的:如果我能找到它(在本例中为“轮椅可访问”),如果我根本找不到它,则该值等于 true,那么该值等于 false。

我管理它周围的事情,比如浏览网站的父详细信息三。但是现在我无法通过class="sc-fHxwqH ddWfJE" 浏览到正确的 XPATH 来查找此表

我试图将其范围缩小到 shell cmd 中的最基本内容:

scrapy shell 'https://www.immoscout24.ch/de/d/wohnung-kaufen-bevilard/4761145?s=2&t=2&l=436&r=40&se=16&ci=3&ct=1290'
tables = response.xpath('//*[@class="sc-fHxwqH ddWfJE"]/table')
for table in tables[1:]:
    print("I found it!!") #this should be returned 8 times, once for each table
    table.xpath('tr/td[1]//text()').extract_first()

通往轮椅通道的完整路径是: //*[@id="root"]/div/div/div[1]/section/article[7]/table/tbody/tr[1]/td[1]

不幸的是,上面的代码没有返回任何东西。我没有收到任何错误,但也没有我期望的打印。

    我做错了什么?我想不会那么难吧? 找到正确的表后,如何以最简单、最快的方式将数据从表中提取到 JSON?我想这会很慢,因为基本上我需要多次解析整个 html 代码来查找每个属性描述是否存在?

感谢您的所有帮助或任何提示!我已经花了几天时间试图弄清楚..

【问题讨论】:

如果"sc-fHxwqH ddWfJE"table 节点的类名,那么XPath 应该是//table[@class="sc-fHxwqH ddWfJE"] 因为'//*[@class="sc-fHxwqH ddWfJE"]/table' 表示table 是某个具有类的节点的直接子节点名称"sc-fHxwqH ddWfJE"。请注意,每张票您应该问一个问题。如果您有更多问题 - 请在单独的工单中提出 我确实使用 scrapy shell 尝试了你的命令,你的 xpath 对我有用。 response.xpath('//*[@id="root"]/div/div/div[1]/section/article[7]/table/tbody/tr[1]/td[1]//text()').extract_first() 产生 'Rollstuhlgängig',这是轮椅可访问的德语单词 :-) 顺便说一句,找到好的 xpath 的快速方法是使用 Chrome 的 XPath Helper 扩展。 非常感谢@Andersson,效果很好。我以为我也试过了,但可能犯了一个错误。我现在将尝试解决问题 2。我完成后会立即发布我的答案。除非有人对此有答案,否则请随时发布。 【参考方案1】:

不需要请求 HTML,抓取节点值并将它们放入 JSON,因为所需的数据已经来自 API 的 JSON 格式

试一试

import requests
import json

url = "https://react-api.immoscout24.ch/v1.3/properties/4761145?ci=3&ct=1290&l=436&lng=de&p=4761145&r=40&s=2&se=16&t=2"
response = requests.get(url).json()

然后你可以得到所需的数据,如

print(response['propertyDetails']['agency'])

输出:

'companyCity': 'Bevilard', 'companyName1': 'avendre.ch ', 'companyName2': 'Agen
ce Berne', 'companyPhoneMobile': '078 868 60 64', 'companyStreet': 'Rue Principa
le 41', 'companyZip': '2735', 'email': 'berne@avendre.ch', 'firstName': 'Verena'
, 'gender': 'f', 'lastName': 'Pecaut-Steiner', 'logoUrl': 'https://www.immoscout
24.ch/resources/memberlogos/L356353-R.jpg', 'nameFormatted': 'Verena Pecaut-Stei
ner', 'webUrl': 'http://www.avendre.ch'

【讨论】:

这绝对是惊人的!你是怎么发现的,它甚至没有记录在他们的网站上:-)。我用谷歌搜索了一下,发现了这个link,我想你就是这样做的。可能会帮助其他人阅读本文,非常感谢! @sspaeti,网页上出现的所有数据很可能来自 HTTP 请求,您只需按 F12 并切换到“网络”选项卡即可检查浏览器发送的请求以获取动态内容【参考方案2】:

如果我理解正确(检查每个article 节点,h2 后跟table

for table_node in response.xpath('//article/h2/following::*[1][name()="table"]'):
    #process each table here

【讨论】:

以上是关于python scrapy - 从 <table> 中提取数据 - 没有 id 标签的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python [duplicate]在scrapy中获取select选项值

从 Python 运行 Scrapy

Scrapy/Python/XPath - 如何从数据中提取数据?

大牛说 | 从爬虫框架scrapy入手学Python

scrapy和python有啥关系

如何从python的scrapy输出中删除'\ n'