【问题标题】:how to parse the href in a specific table?如何解析特定表中的href?
【发布时间】:2021-08-01 13:55:45
【问题描述】:

考虑一下关于国家列表的维基百科页面https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)

我正在尝试仅解析 Region 列的超链接。也就是说,对于Americas 的值,我只关心https://en.wikipedia.org/wiki/Americas。我可以使用

成功解析表格
import requests
fullwiki = requests.get('https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)')
parsed = BeautifulSoup(fullwiki.content)
table = parsed.find('table')

但我无法提取此精确列(及其超链接)。

例如,查看a标签可以很容易地返回all超链接,但是如何在列Region中找到超链接(假设你不能作弊并使用超链接文本过滤超链接)?

table.find_all('a')
 <a href="/wiki/Bethesda,_Maryland" title="Bethesda, Maryland">Bethesda, Maryland</a>,
 <a class="external text" href="https://www.nyse.com/quote/XNYS:HWM" rel="nofollow">HWM</a>,
 <a href="/wiki/Howmet_Aerospace" title="Howmet Aerospace">Howmet Aerospace</a>,
 <a class="external text" href="https://www.sec.gov/cgi-bin/browse-edgar?CIK=HWM&amp;action=getcompany" rel="nofollow">reports</a>

有什么想法吗?

谢谢!

【问题讨论】:

  • 我不知道该怎么做。你可以吗?谢谢
  • 如果你有表格,那么你可以忽略除第二列之外的所有内容,那么你甚至不必费心通过a标签搜索
  • 是的,但是例如使用 pd.read_html 解析表格将不会返回 href...仅限美洲
  • @ℕʘʘḆḽḘ 下面你应该有答案了。

标签: python pandas beautifulsoup python-requests


【解决方案1】:

您可以尝试以下方法:

import requests
from bs4 import BeautifulSoup
import pandas as pd

fullwiki = requests.get('https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)')

soup= BeautifulSoup(fullwiki.content,"lxml")
# "lxml" is the parser you may use other parser. As far I know lxml is faster then other so I have used it.

trs = soup.find('table',class_="mw-datatable").find_all("tr")
# "mw-datatable" is the class name if the table you want to find from that link.
# There are multiple tables so by using specific table class name it select the table that we want

lst=[]
for tr in trs[2:]:
    tds=tr.find_all("td")
    link=f'https://en.wikipedia.org{tds[1].find("a")["href"]}'

    if link not in lst : # To don't take duplicate links, if you want all of links then
        lst.append(link) # You may remove all these IFs and write this line only.

    if len(lst)==5: # To don't literate unnecessary after getting all links 
        break

print(lst)
"""
['https://en.wikipedia.org/wiki/Americas', 'https://en.wikipedia.org/wiki/Asia', 'https://en.wikipedia.org/wiki/Europe',
'https://en.wikipedia.org/wiki/Oceania', 'https://en.wikipedia.org/wiki/Africa']
"""

df=pd.DataFrame({"Region":lst})

print(df)
"""
                                   Region
0  https://en.wikipedia.org/wiki/Americas
1      https://en.wikipedia.org/wiki/Asia
2    https://en.wikipedia.org/wiki/Europe
3   https://en.wikipedia.org/wiki/Oceania
4    https://en.wikipedia.org/wiki/Africa
"""

这将为您提供来自DataFrame 中区域列的 5 个链接,如输出所示。

【讨论】:

  • 如果是这样的话,那就是源网站的问题而不是这段代码?垃圾输入=垃圾输出
  • 多次你的意思是那里总共有7个不同的链接,但它们重复了100多次?如果是,可能是 OP 在其他地方使用此代码?
  • 谢谢,我只关心超链接。在示例中,我们只有 7 个不同的,但没关系。
  • 谢谢!只是一个简单的问题,你为什么在这里选择lxml,你是怎么想到mw-datatable的?
  • @ℕʘʘḆḽḘ 我已经更新了答案,请检查并通知我。如果您清楚地了解所有部分,另外如果您不想要数据框,那么您可以删除这些部分。我相信您在某处提到过它,所以我在回答中提供了它。
【解决方案2】:
import requests
from bs4 import BeautifulSoup
from pprint import pp


def main(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    goal = [x['href'] for x in soup.select('td[style="text-align:center"] a')]
    pp(goal)


main('https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)')

输出:

['/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Oceania',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Oceania',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Oceania',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Oceania',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Asia',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Oceania',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Asia',
 '/wiki/Oceania',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Asia',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Europe',
 '/wiki/Americas',
 '/wiki/Oceania',
 '/wiki/Africa',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Africa',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Americas',
 '/wiki/Oceania',
 '/wiki/Americas',
 '/wiki/Oceania',
 '/wiki/Americas',
 '/wiki/Oceania',
 '/wiki/Africa',
 '/wiki/Oceania',
 '/wiki/Oceania',
 '/wiki/Americas',
 '/wiki/Oceania',
 '/wiki/Oceania',
 '/wiki/Oceania',
 '/wiki/Oceania',
 '/wiki/Americas',
 '/wiki/Oceania']

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2015-05-09
    • 2015-04-06
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多