如何利用列表变量在XPath中抓取位置不固定的书籍封面信息
嘿,这个问题我熟!你想通过动态的封面类型列表来匹配对应的HTML元素,而不是硬编码Hardcover对吧?毕竟列表项位置不固定,靠索引太不靠谱了,我给你两种实用的解决思路:
1. 静态XPath(适合列表短的情况)
如果你的cover列表元素不多,可以直接用or把所有选项拼进XPath里,匹配<b>标签文本属于列表中任意一项的<li>元素:
//div[@class='content']/ul/li[b[text()='Hardcover' or text()='BoardBook' or text()='CardBook']]
不过要注意,你的示例里<b>标签文本是Hardcover:(带冒号),如果cover列表里是不带冒号的,得调整匹配逻辑,比如用starts-with来匹配开头:
//div[@class='content']/ul/li[b[starts-with(text(), 'Hardcover') or starts-with(text(), 'BoardBook') or starts-with(text(), 'CardBook')]]
要是文本里有多余空格,还可以加上normalize-space()来处理:
//div[@class='content']/ul/li[b[starts-with(normalize-space(text()), 'Hardcover') or starts-with(normalize-space(text()), 'BoardBook') or starts-with(normalize-space(text()), 'CardBook')]]
2. 动态生成XPath(推荐,适合列表可变的情况)
如果cover列表经常变动,手动写XPath太麻烦,用编程语言动态生成条件就方便多了。以Python为例,不管你用lxml还是Scrapy,都可以这么做:
cover = ['Hardcover', 'BoardBook', 'CardBook'] # 生成匹配条件:把列表里的每个元素转成starts-with的判断,用or连接 xpath_conditions = " or ".join([f"starts-with(normalize-space(text()), '{item}')" for item in cover]) # 拼接完整的XPath full_xpath = f"//div[@class='content']/ul/li[b[{xpath_conditions}]]" # 之后就可以用这个full_xpath去查找元素了 # 比如用lxml的示例: from lxml import etree html = """你的HTML内容""" tree = etree.HTML(html) target_li = tree.xpath(full_xpath) if target_li: # 提取你需要的信息,比如页数 info = target_li[0].text_content().strip().split(':')[1].strip() print(info)
这个方法的好处是,不管cover列表新增或删除元素,你都不用改XPath的逻辑,只要维护好列表就行。
内容的提问来源于stack exchange,提问作者Land Owner
相关产品推荐
相关产品推荐

