繁体   English   中英

Python lxml xpath - 返回所有标签而不是选择

[英]Python lxml xpath - returns all tags instead of selected

这是我的第一篇文章,所以你好世界!

我正在使用“请求”和“lxml”在 Python3 中编写一个小型网络爬虫。 我已经做了一个,这是不同网站的第二个项目。

我遇到了奇怪的结果 - xpath 方法返回所有标签,而不是选定的 DIV。 更糟糕的是,输出乘以“offer-detail”DIV 的出现次数。

Xpath 计数返回正确的 DIV 数量,我也将 page.content 转储到文件并手动检查,一切都是正确的。 我已经使用 Chrome 的“Xpath helper”插件检查了网站上的 xpath -屏幕截图

刮板输出 - http://pastebin.com/1bEdzXdJ (又长又乱)

但是在我的第一个项目中没有发生这样的事情,它仍然返回正确的输出。

爬取网址: http://www.ibood.com/pl/pl/all-deals/ : http://www.ibood.com/pl/pl/all-deals/

我非常感谢移动高级用户的任何帮助:)

代码:

import requests
from fake_useragent import UserAgent
from lxml import html

ua = UserAgent()
header_data = {'User-Agent': ua.chrome}

website = 'http://www.ibood.com/pl/pl/all-deals/'

page = requests.get(website, headers=header_data)

document = html.fromstring(page.content)

# //div[@class="all-offers"]/div/div[@class="offer-wrap"]
# # /div[@class="offer-detail"]

deals = document.xpath('//div[@class="offer-detail"]')

count = document.xpath('count(//div[@class="offer-detail"])')

print('count: ' + str(count))

for deal in deals:
    print(deal.xpath('//text()'))
print(deal.xpath('.//text()'))

//意味着从根开始获取所有后代

.//表示从当前上下文 node('deal') 获取所有后代

这将返回所有节点:

count: 4.0
['\n                                                    ', 'Przenośny głośnik Bluetooth UE MEGABOOM', '\n                            ', '\n                                ', 'Cena katalogowa ', '1.319,95 zł', 'Tylko', 'Dzisiaj', '579,95 zł', '                                ', '\n    ', '\n        ', '\n                    ', 'Przewidywany czas wysyłki dla tego produktu  to 13.01.2017', '\n            ', '\n    29,95 zł Dostawa', '                            ', '\n                            ', '\n                                ', '\n                                    ', '\n                                ', '\n                                                            ', '\n                            ', '\n                                                        ', '\n                            ', '\n                                                                    ', 'Wyprzedane!', '\n                                                            ', '\n                            ', '56%', 'zniżka', '\n                                               ']

更好的方法:

for deal in deals:
    print(deal.xpath('normalize-space(string())'))

出去:

count: 4.0
Przenośny głośnik Bluetooth UE MEGABOOM Cena katalogowa 1.319,95 złTylkoDzisiaj579,95 zł Przewidywany czas wysyłki dla tego produktu to 13.01.2017 29,95 zł Dostawa Wyprzedane! 56%zniżka
Ukośnica Metabo KGS 254 M Cena katalogowa 1.639,95 złTylkoDzisiaj1.024,95 zł Przewidywany czas wysyłki dla tego produktu to 17.01.2017 39,95 zł Dostawa 11:18:18 lub do wyprzedania zapasów! Kupuję! 38%zniżka
3 pary bokserek SuperDry Cena katalogowa 179,95 złTylkoDzisiaj114,95 zł Przewidywany czas wysyłki dla tego produktu to 17.01.2017 29,95 zł Dostawa 11:18:18 lub do wyprzedania zapasów! Kupuję! 36%zniżka
2 Ładowarki akumulatorów Philips MultiLife Cena katalogowa 124,95 złTylkoDzisiaj34,95 zł Przewidywany czas wysyłki dla tego produktu to 11.01.2017 29,95 zł Dostawa 11:18:18 lub do wyprzedania zapasów! Kupuję! 72%zniżka

normalize-space函数通过去除前导和尾随空格并用单个空格替换空格字符序列来返回带有标准化的空格的参数字符串。

发布问题后,我找到了解决方案:

我应该使用“.//”而不是“//”。

这个答案有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM