python - 在字符串中使用 XPath

标签 python xpath scrapy

假设我们从浏览器收到以下响应:

<div>
  <tr id="1"></tr>
  <tr id="2">
  <!--
    <div class="A">AAA</div>
    <div class="C">BBB</div>
    <div class="C">CCC</div>
  -->
  </tr>
</div>

在scrapy中使用xpath获取评论字符串应该是这样的:

response.xpath(//tr[@id="2"]/comment())

所以我的问题 - 有没有简单的方法来提取 <div class="C" 的值> 评论中的标签? 一种方法是删除字符串 <!-- (...) --> 中的注释标签。 ,并使用lxml.html库再次将结果转换为 HTML 并在其中使用 xpath,但我很确定这应该是一种更简单的方法...

如果有任何帮助,我将不胜感激。干杯!

最佳答案

在我看来,用lxml.html解析评论内容是一个很好的解决方案。

Python代码

from lxml import etree
from io import StringIO

parser = etree.HTMLParser()

html_text = """<div>
  <tr id="1"></tr>
  <tr id="2">
  <!--
    <div class="A">AAA</div>
    <div class="C">BBB</div>
    <div class="C">CCC</div>
  -->
  </tr>
</div>"""

tree = etree.parse(StringIO(html_text), parser)

comment = tree.xpath("//tr[@id='2']/comment()")

comment_text = str(comment[0])

# string needs an outermost element in order to be parseable

comment_text = comment_text.replace("<!--", "<html>").replace("-->", "</html>")

embedded_tree = etree.parse(StringIO(comment_text), parser)

embedded_tree.xpath("//div[@class='C']/text()")

输出

['BBB', 'CCC']

关于python - 在字符串中使用 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59973906/

相关文章:

python - 重命名 scrapy 项目

python - Pyspark DataFrame 中的嵌套 SELECT 查询

java - JAXB/MOXy : How to set which xpath impl to use?

python - 为什么在 spider.py 中需要 spider 对象来进行 scrapy?

python - Scrapy抓取多个页面错误过滤重复

xpath - 为什么需要//而不是/

python for循环只执行一次?

python - matplotlib 标签和图例中的“半空格”

python - 使用 Python 关闭没有特定标签的 EC2 实例

python - 如何单击 <svg :image> element using Selenium and Python