gpt4 book ai didi

python - 当html标签丢失时,如何使用scrapy提取标签值列表

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:16 32 4
gpt4 key购买 nike

我当前正在使用

处理文档
<b> label1 </b>
value1 <br>
<b> label2 </b>
value2 <br>
....

我无法找出使用 scrapy 的 xpath 的干净方法。这是我最好的实现

hxs = HtmlXPathSelector(response)

section = hxs.select(..............)
values = section.select("text()[preceding-sibling::b/text()]"):
labels = section.select("text()/preceding-sibling::b/text()"):

但我对这种通过索引匹配两个列表的节点的方法不满意。我宁愿迭代 1 个列表(值或标签)并将匹配节点作为相对 xpath 进行查询。如:

values = section.select("text()[preceding-sibling::b/text()]"):
for value in values:
value.select("/preceding-sibling::b/text()"):

我一直在调整这个表达式,但总是不返回任何匹配项

更新

我正在寻找能够容忍“噪音”的稳健方法,例如:

garbage1<br>
<b> label1 </b>
value1 <br>
<b> label2 </b>
value2 <br>
garbage2<br>
<b> label3 </b>
value3 <br>
<div>garbage3</div>

最佳答案

编辑:抱歉我使用lxml,但它与Scrapy自己的选择器的工作原理相同。

对于您给出的特定 HTML,这将起作用:

>>> s = """<b> label1 </b>
... value1 <br>
... <b> label2 </b>
... value2 <br>
... """
>>>
>>> import lxml.html
>>> lxml.html.fromstring(s)
<Element span at 0x10fdcadd0>
>>> soup = lxml.html.fromstring(s)
>>> soup.xpath("//text()")
[' label1 ', '\nvalue1 ', ' label2 ', '\nvalue2 ']
>>> res = soup.xpath("//text()")
>>> for i in xrange(0, len(res), 2):
... print res[i:i+2]
...
[' label1 ', '\nvalue1 ']
[' label2 ', '\nvalue2 ']
>>>

编辑2:

>>> bs = etree.xpath("//text()[preceding-sibling::b/text()]")
>>> for b in bs:
... if b.getparent().tag == "b":
... print [b.getparent().text, b]
...
[' label1 ', '\nvalue1 ']
[' label2 ', '\nvalue2 ']
[' label3 ', '\nvalue3 ']

此外,如果您要循环选定的元素,您希望在 for 循环内的 xpath 中执行“./foo”,而不是“/foo”。

关于python - 当html标签丢失时,如何使用scrapy提取标签值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16745209/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com