gpt4 book ai didi

python - 从维基百科获取链接

转载 作者:行者123 更新时间:2023-12-01 04:11:36 25 4
gpt4 key购买 nike

我正在使用 scrapy 来抓取此页面:

https://en.wikipedia.org/wiki/List_of_shopping_malls_in_the_United_States

链接位于:

data = response.xpath('//*[@id="mw-content-text"]/ul[9]/li').extract()

数据在哪里:

[<Selector xpath='//*/li' data=u'<li><a href="/wiki/Ala_Moana_Center" tit'>,
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Kahala_Mall" title="K'>,
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Pearlridge" title="Pe'>,
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Prince_Kuhio_Plaza" t'>,
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Victoria_Ward_Centers'>]

我需要的链接是:

https://en.wikipedia.org + 链接

例如:

'https://en.wikipedia.org ' + '/wiki/Ala_Moana_Center'

为此,我使用正则表达式

link = 'https://en.wikipedia.org' + re.findall('href="([^"]+)',str(data[0]))[0]

name = re.findall('href="([^"]+)',str(data[0]))[0].replace('/wiki/','').replace('_',' ')

问题是,通过这种方法,我必须创建一个循环来获取链接,有没有一种方法可以直接从 scrapy 或至少以更有效的方式创建这些链接?

最佳答案

Nono,不需要正则表达式,将您的 XPath 直接指向 href 属性:

data = response.xpath('//*[@id="mw-content-text"]/ul[9]/li/a/@href').extract()

然后,使用 urlparse.urljoin()使用 response.url 作为基础构造绝对 URL:

from urlparse import urljoin

base_url = response.url
data = [urljoin(base_url, link)
for link in response.xpath('//*[@id="mw-content-text"]/ul[9]/li/a/@href').extract()]
<小时/>

顺便说一句,我不太喜欢 XPath 表达式中的 ul[9] 部分 - 一般来说,使用索引并不可靠并且很容易损坏 - 而且你无法阅读并理解表达方式。看起来,您正在寻找夏威夷购物中心。根据前面的 Hawaii 标签找到链接:

//a[. = "Hawaii"]/following::ul/li/a/@href 

通过此表达式,可以轻松了解您实际定位的内容。

<小时/>

以下是如何按状态对链接进行分组的方法,例如来自 Shell 的示例:

$ scrapy shell https://en.wikipedia.org/wiki/List_of_shopping_malls_in_the_United_States
>>> from urlparse import urljoin
>>> from pprint import pprint
>>>
>>> base_url = response.url
>>>
>>> data = {}
>>> for state in response.xpath("//h3[span[@class='mw-headline']]"):
... state_name = state.xpath(".//a[@title]/text()").extract_first()
... links = [urljoin(base_url, link) for link in state.xpath('./following-sibling::*[1]//li/a/@href').extract()]
... data[state_name] = links
>>>
>>> pprint(data)

关于python - 从维基百科获取链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34846322/

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