我正在try 获取具有特定属性值的每个 node 的元素/标记名.

我有一个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>

我有一个要收集的信息 node 列表,名为nodes.

我使用以下命令从这些 node 中 Select 文本:

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

我还需要 node 元素的名称.但是,当我在相同的for循环中使用此行时:

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

我得到错误:

ValueError: XPath error: Invalid expression

我try 了许多变体,但无法获得每个 node 的元素/标记名称.

推荐答案

我所知道的获取元素标记名称的最好方法是使用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']
  • 在上面的示例中,我从您提供的示例中获取标记,并将其包装在父标记中.
  • 然后,我使用它来创建一个粗糙的 Select 器对象.
  • 然后,我运行一个XPath查询来获取具有node属性的所有元素
  • 然后使用.re方法搜索正则表达式模式以找到元素标记名.
  • 输出是包含 node 属性的所有元素标记名的列表.

Python相关问答推荐

Locust请求中的Python和参数

重新匹配{ }中包含的文本,其中文本可能包含{{var}

Pandas - groupby字符串字段并按时间范围 Select

try 将一行连接到Tensorflow中的矩阵

创建可序列化数据模型的最佳方法

转换为浮点,pandas字符串列,混合千和十进制分隔符

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

Polars asof在下一个可用日期加入

使用BeautifulSoup抓取所有链接

如何在海上配对图中使某些标记周围的黑色边框

巨 Python :逆向猜谜游戏

如何在Great Table中处理inf和nans

pandas:在操作pandora之后将pandora列转换为int

根据Pandas中带条件的两个列的值创建新列

使用tqdm的进度条

提取最内层嵌套链接

如何用FFT确定频变幅值

Stats.ttest_ind:提取df值

是否将Pandas 数据帧标题/标题以纯文本格式转换为字符串输出?

根据边界点的属性将图划分为子图