使用Scrapy从href递归提取文本

时间:2020-07-27 04:51:53

标签: python scrapy

我们有以下HTML:

<a class="link contact-info__link" href="tel:+99999999999">
    <svg class="icon icon--telephone contact-info__link-icon contact-info__link-icon--phone">
        <use xlink:href="/local/templates/.default/img/icon-font/icon-font.svg#icon-phone"></use>
    </svg>
    <span class="contact-info__link-text">+9 (999) 999-99-99</span>
</a>

我需要得到这本字典:

{"tel:+99999999999": "+9 (999) 999-99-99"}

也就是说,无论在href之后有多少个“子”标签,我都需要text链接和相应的href。在这种情况下,我需要href链接本身和text中的span,但是请考虑它可以是span或任何其他类型的标签。

我目前正在使用此代码从任何页面获取所有href + text(因为这是目标):

for r in response.css('a'):
    url = r.css('::attr(href)').get()
    txt = r.css('::text').get()

适用于这种情况:

<a href="tel:+99999999999">This is my phone</a>

但是当它像第一个代码那样递归时,它不会返回:

{"tel:+99999999999": "\n"}

2 个答案:

答案 0 :(得分:0)

要在a标签下获取全文,可以使用getall()方法,然后将所有文本join合并为一个字符串。 您可以使用以下示例:

url = r.css('::attr(href)').get()
txt = r.css('::text').getall()
txt = ''.join([t.strip() for t in txt if t.strip()]) if txt else txt

答案 1 :(得分:0)

尝试一下

tel_s = response.css('.link contact-info__link')
yield {tel_s.css('::attr(href)').get(): tel_s.css('span::text)').get()}

输出:

{"tel:+99999999999": "+9 (999) 999-99-99"}