Scrapy SgmlLinkExtractor如何定义XPath

时间:2016-09-20 18:32:51

标签: python regex xpath scrapy

我想要检索cityname和citycode并将其存储在一个字符串变量中。图像显示了精确的位置:

enter image description here

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定义?

2 个答案:

答案 0 :(得分:1)

大多数情况下,这是因为浏览器会更正无效的HTML。你是如何解决这个问题的?检查(原始)HTML源代码并编写自己的XPath,使用最短/最简单的查询来导航DOM。

我从网上搜集了大量数据,而且我从未使用过像浏览器那样具体的XPath。这有几个原因:

  1. 无效HTML或最基本的层次结构更改会很快失败。
  2. 当网站发生变化时,它不包含用于调试问题的识别数据。
  3. 它比应该的时间长。
  4. 这是 示例 (您可以编写很多不同的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']