我想要检索cityname和citycode并将其存储在一个字符串变量中。图像显示了精确的位置:
Google Chrome给了我以下XPath:
//*[@id="page"]/main/div[4]/div[2]/div[1]/div/div/div[1]/div[2]/div/div[1]/div/a[1]/span
因此,我在scrapy中定义了以下语句以获取所需信息:
plz = response.xpath('//*[@id="page"]/main/div[4]/div[2]/div[1]/div/div/div[1]/div[2]/div/div[1]/div/a[1]/span/text()').extract()
但是我没有成功,字符串仍为空。我应该使用什么XPath定义?
答案 0 :(得分:1)
大多数情况下,这是因为浏览器会更正无效的HTML。你是如何解决这个问题的?检查(原始)HTML源代码并编写自己的XPath,使用最短/最简单的查询来导航DOM。
我从网上搜集了大量数据,而且我从未使用过像浏览器那样具体的XPath。这有几个原因:
这是 示例 (您可以编写很多不同的XPath查询来查找此数据,我建议您学习并重新编写此查询,以便在整个项目中有一些XPath查询的常见主题)查询抓取该元素:
//div[contains(@class, "detail-address")]//h2/following-sibling::span
此问题的另一个主要来源是广泛依赖JS来修改屏幕上显示内容的网站。但是,方便的是,这将调试与上面相同。只要看一下页面加载时返回的HTML,就会发现在执行JS之前,您查询的数据不存在。此时,您需要执行某种headless browsing。
由于我的回答基本上是“编写自己的XPath”(而不是依赖于浏览器),我会留下一些消息来源:
答案 1 :(得分:1)
DOM由javascript操纵,因此chrome显示的是后面的xpath 所有的事情都发生了。
如果您只想要获得城市,您可以通过这种方式获得(使用scrapy):
city_text = response.css('.detail-address span::text').extract_first()
city_code, city_name = city_text.split(maxsplit=1)
或者您可以在CDATA中操作JSON以获取所需的所有数据:
cdata_text = response.xpath('//*[@id="tdakv"]/text()').extract_first()
json_str = cdata_text.splitlines()[2]
json_str = json_str[json_str.find('{'):]
data = json.loads(json_str) # import json
city_code = data['kvzip']
city_name = data['kvplace']