Извлечение содержимого из мета-тега в <head>с помощью Xpath с использованием нескольких условий - PullRequest
0 голосов
/ 27 января 2019

Я хочу выбрать xpath мета-тега с двумя условиями.Обычно это работает так:

//div[@id='..' and @class='...]

Однако метатег, который я хочу извлечь, выглядит следующим образом:

< meta name="Description" xml:lang="en" content="Some text which I want to extract.">

И я попытался:

extract_with_xpath('//meta[@name="Description" and @xml:lang="en"]/@content')

Также:

extract_with_xpath('//meta[@name="Description" and (@xml:lang="en")]/@content')

Также пробовал несколько других вариантов, но ни один из них не работает.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

После просмотра вашего веб-сайта, метатег на самом деле:

<meta name="DC.Description" xml:lang="en" content="some text">

Чтобы извлечь содержимое, используйте следующий xpath:

d_x = '//meta[@name="DC.Description"]'

Кроме того, в одном и том же селекторе есть несколько метатегов. xml:lang - это атрибут, который различает содержимое, но xpaths или css 'не обрабатывают этот тип атрибута с разделителем. Вы должны сделать это:

desc_metas = response.xpath(ds_x)    #Extract only metas with description
filter_desc = []
for d in desc_metas:
    filter_desc.append(d.replace('xml:lang', 'lang'))    #Replacing xml:lang with lang only so that our selector can detect that

Теперь, чтобы получить описание соответствующего языка, например; 'Ан'

en_desc = None
for d in filter_desc:
   d = Selector(text=d)    #converting back, string to Selector
   if d.xpath('//meta[@lang="en"]/@content'):    #now Applying lang attribute to get the desired content.

        en_desc = d.xpath('//meta[@lang="en"]/@content')
0 голосов
/ 27 января 2019

У вас есть место в теге < meta, поэтому мне также не удалось извлечь данные из него.Но вы можете попробовать:

import re
from scrapy import Selector

txt = """< meta name="Description" xml:lang="en" content="Some text which I want to extract.">"""
txt_stripped = re.sub(r'<\s(\w+)', r'<\1', txt)
sel = Selector(text=txt_stripped)
print sel.css("meta[name=Description][xml\:lang='en']::attr(content)").get()
...