XPath 不适用于屏幕抓取
XPath not working for screen scraping
我正在使用 Scrapy 进行屏幕抓取项目,但遇到了 XPath 问题。
我正在尝试从下图中获取 94,218,但是我使用的 XPath 和 CSS 不工作。
来自此页面:https://fancy.com/things/280558613/I%27m-Fine-T-Shirt
我用 Scrapy 尝试了多个 XPath 和 CSS,但一切都返回空白。
这里有一些例子:
response.xpath('/html/body/div[1]/div[1]/div[1]/aside/div[1]/div/div/a[2]/text()').extract()
response.xpath('//*[@id="sidebar"]/div[1]/div/div/a[2]/text()').extract()
response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "fancyd_list", " " ))])'.extract()
response.xpath(".//*[@id='sidebar']/div[1]/div/div/a[2]/text()")
我试过 Firebug、Firepath、Chrome 开发工具和不同的插件,但是 none 的 XPath 或 CSS 似乎可以工作..有人可以帮忙吗?
实际页面上的代码是:
<a href="#" class="fancyd_list "/>
6
</a>
一些 XPath 有效,但它们不包含文本,因此看起来像这样:<a href="#" class="fancyd_list "/></a>
我也试过使用BeautifulSoup,但它有同样的问题:
print soup.find_all('a',class_='fancyd_list')
[<a class="fancyd_list " href="#"></a>, <a class="fancyd_list " href="#"></a>]
谢谢!
这里的问题是所提供的 URL 返回 HTML,其中包含以下格式错误的 <a>
标记:
<a href="#" class="fancyd_list "/> # Malformed HTML, <a> tag closes here
94,218
</a>
这里的第一行在右括号之前包含一个 /
,根据 HTML 标准,它表示 <a>
标记的完成。由于Scrapy,<a>
元素已经完成,你无法获取标签之外的文本。
之前建议使用 BeautifulSoup 在这里可能是个好主意,因为它可以更好地处理格式错误的 HTML much。
对于此示例,您可以使用的另一个选项是通过类似于以下内容的方法自行修复 HTML:
new_body = re.sub(r'<a href="#" class="fancyd_list "/>', '<a href="#" class="fancyd_list ">', response.body)
response = response.replace(body=new_body)
然后您可以通过
从响应中select
response.xpath("//div[@class='frm']/div[@class='figure-button']/a[contains(@class, 'fancyd_list')]/text()").extract()
我使用 "contains" 的原因是因为 class 名称(对我而言)在其名称末尾出现了 space,因此 Scrapy 的检查"a[@class='fancyd_list']"
的将失败,因为 "fancyd_list" != "fancyd_list "
我正在使用 Scrapy 进行屏幕抓取项目,但遇到了 XPath 问题。
我正在尝试从下图中获取 94,218,但是我使用的 XPath 和 CSS 不工作。
我用 Scrapy 尝试了多个 XPath 和 CSS,但一切都返回空白。
这里有一些例子:
response.xpath('/html/body/div[1]/div[1]/div[1]/aside/div[1]/div/div/a[2]/text()').extract()
response.xpath('//*[@id="sidebar"]/div[1]/div/div/a[2]/text()').extract()
response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "fancyd_list", " " ))])'.extract()
response.xpath(".//*[@id='sidebar']/div[1]/div/div/a[2]/text()")
我试过 Firebug、Firepath、Chrome 开发工具和不同的插件,但是 none 的 XPath 或 CSS 似乎可以工作..有人可以帮忙吗?
实际页面上的代码是:
<a href="#" class="fancyd_list "/>
6
</a>
一些 XPath 有效,但它们不包含文本,因此看起来像这样:<a href="#" class="fancyd_list "/></a>
我也试过使用BeautifulSoup,但它有同样的问题:
print soup.find_all('a',class_='fancyd_list')
[<a class="fancyd_list " href="#"></a>, <a class="fancyd_list " href="#"></a>]
谢谢!
这里的问题是所提供的 URL 返回 HTML,其中包含以下格式错误的 <a>
标记:
<a href="#" class="fancyd_list "/> # Malformed HTML, <a> tag closes here
94,218
</a>
这里的第一行在右括号之前包含一个 /
,根据 HTML 标准,它表示 <a>
标记的完成。由于Scrapy,<a>
元素已经完成,你无法获取标签之外的文本。
之前建议使用 BeautifulSoup 在这里可能是个好主意,因为它可以更好地处理格式错误的 HTML much。
对于此示例,您可以使用的另一个选项是通过类似于以下内容的方法自行修复 HTML:
new_body = re.sub(r'<a href="#" class="fancyd_list "/>', '<a href="#" class="fancyd_list ">', response.body)
response = response.replace(body=new_body)
然后您可以通过
从响应中selectresponse.xpath("//div[@class='frm']/div[@class='figure-button']/a[contains(@class, 'fancyd_list')]/text()").extract()
我使用 "contains" 的原因是因为 class 名称(对我而言)在其名称末尾出现了 space,因此 Scrapy 的检查"a[@class='fancyd_list']"
的将失败,因为 "fancyd_list" != "fancyd_list "