假设我们收到来自浏览器的以下响应:
<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>
使用xpath在scrapy中获取注释字符串应该类似于:
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']
谢谢Mathias!这很有用