scrapy 使用XPath从属性值获取元素名称

dxpyg8gm  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(145)

我试图获取每个节点的元素/标记名称,其中我有一个特定的属性值。
我有一个xml:

<a node='1'>This</a>
<b node='2'>Is</b>
<c node='23'>A</c>
<d selector='g'>Loud</d>
<e node='4'>Dog</e>

字符串
我有一个我想收集的信息节点列表,名为nodes
我使用以下命令从这些节点中选择文本:

for node in nodes:
   get_text = response.xpath(f'//*[@node="{node}"]//text()').extract()


我还需要节点元素的名称。然而,当我在同一个for循环中使用这一行时:

get_name = response.xpath(f'//*[@node="{node}"]/name()').get()


我得到错误:

ValueError: XPath error: Invalid expression


我已经尝试了许多变体,但无法获得每个节点的元素/标记名称。

jdg4fx2g

jdg4fx2g1#

我所知道的获取元素标记名称的最好方法是使用regex方法re中内置的scrapy。
通常使用的模式是r'<(\w+)\s'
下面是一个示例:
scrapy shell

In [1]: markup = """<html><a node='1'>This</a>
   ...: <b node='2'>Is</b>
   ...: <c node='23'>A</c>
   ...: <d selector='g'>Loud</d>
   ...: <e node='4'>Dog</e></html>"""

In [2]: sel = scrapy.Selector(text=markup)

In [3]: sel.xpath('//*[@node]').re('<(\w+)\s')
Out[3]: ['a', 'b', 'c', 'e']

字符串

  • 在上面的示例中,我从您提供的示例中获取标记,并将其 Package 在父标记中。
  • 然后我用它来创建一个scrapy选择器对象。
  • 然后我运行一个xpath查询来获取所有具有node属性的元素
  • 然后使用.re方法搜索regex模式以找到元素标记名称。
  • 其输出是包含节点属性的所有元素标记名称的列表。

相关问题