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 个表的类如下:<table class="sc-fHxwqH ddWfJE">
在这张图片structure and table I'd like to extract 中,您可以看到我想要提取的结构和列 (<td>
),其中值为 = "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选项值