使用Beautifulsoup4查找.nextsibling

时间:2018-05-03 10:44:04

标签: python python-2.7 web-scraping beautifulsoup

我试图从URL获取(某些)表的内容。 到目前为止,我已经设法获得了两个所需的页面内容,但还有第三个(第三列),我只想获得它的文本。问题是,底层链接存在于页面的其他位置(使用不同的文本),如果我想将表加载到SQL数据库中,则第三列的内容不会与前两列匹配。

import urllib2
from bs4 import BeautifulSoup4
startURL = "http://some.url/website.html"
page = urllib2.urlopen(startURL).read()
soup = BeautifulSoup(page, "html.parser")
for links in soup.findAll("a"):
    if "href" in links.attrs:
        www = links.attrs.values()
        if not "https://" in www[0]:  # to exclude all non-relative links, e.g. external links
            if "view/" in www[0]: # To get only my desired links of column 1
                link_of_column1 = www[0]   # this is now my wanted link

好的,所以使用这段代码我可以获得第二列。我将在何处以及如何应用.nextsibling()函数来获取下一个(第3)列中的下一个链接?

编辑: 我被问到:网址是https://myip.ms/browse/web_hosting/World_Web_Hosting_Global_Statistics.html,我想从第2栏和第3栏获取内容,这是"托管公司" (链接文字和链接)和"国家" (只有文字)。

EDIT2: 我忘记了另一件事......我如何提取其137,157 records的信息?

3 个答案:

答案 0 :(得分:1)

首先使用id=web_hosting_tbl属性找到包含所有信息的表。然后遍历表的所有行。但是,如果您查看页面源,您需要的行不是连续的,而是替代的,并且它们没有任何类名。此外,表的第一行是标题行,所以我们要跳过它。

获取所需的行(使用table.find_all('tr')[1::2])后,找到所有列,然后从相应的列中获取所需的信息。

<强>代码:

import requests
from bs4 import BeautifulSoup

r = requests.get('https://myip.ms/browse/web_hosting/World_Web_Hosting_Global_Statistics.html')
soup = BeautifulSoup(r.text, 'lxml')

table = soup.find('table', id='web_hosting_tbl')
for row in table.find_all('tr')[1::2]:
    all_columns = row.find_all('td')
    name = all_columns[1].a.text
    link = all_columns[1].a['href']
    country = all_columns[2].a.text
    print(name, link, country, sep=' | ')

部分输出:

Godaddy.com, LLC | /view/web_hosting/2433/Godaddy_com_LLC.html | USA
Cloudflare, Inc | /view/web_hosting/4638/Cloudflare_Inc.html | USA
Amazon.com, Inc | /view/web_hosting/615/Amazon_com_Inc.html | USA
Ovh Sas | /view/web_hosting/7593/Ovh_Sas.html | France
Hetzner Online Ag | /view/web_hosting/45081/Hetzner_Online_Ag.html | Germany
Hostgator.com Llc | /view/web_hosting/26757/Hostgator_com_Llc.html | USA
Google Inc | /view/web_hosting/617/Google_Inc.html | USA
Bluehost Inc | /view/web_hosting/3886/Bluehost_Inc.html | USA
...

答案 1 :(得分:1)

代码:(Python 3.6 +,使用f-strings

bnm = json_string.get('c').get('d').get('e')

<强>输出:

bnm = json_string.get('c')[0].get('d').get('e')

在晚上用一些解释更新答案。干杯!

答案 2 :(得分:0)

尝试以下方法。它应该为您提供column 2的文本,column 2的链接以及该表格中column 3的文本。我使用lxml代替BeautifulSoup来加快速度。感谢。

import requests
from urllib.parse import urljoin
from lxml.html import fromstring

URL = 'https://myip.ms/browse/web_hosting/World_Web_Hosting_Global_Statistics.html'

res = requests.get(URL)
root = fromstring(res.text)

for items in root.cssselect('#web_hosting_tbl tr:not(.expand-child)')[1:]:
    name = items.cssselect("td.row_name a")[0].text
    link = urljoin(URL,items.cssselect("td.row_name a")[0].attrib['href'])
    country = items.cssselect("td a[href^='/view/best_hosting/']")[0].text
    print(name, link, country)

结果:

Godaddy.com, LLC https://myip.ms/view/web_hosting/2433/Godaddy_com_LLC.html USA
Cloudflare, Inc https://myip.ms/view/web_hosting/4638/Cloudflare_Inc.html USA
Amazon.com, Inc https://myip.ms/view/web_hosting/615/Amazon_com_Inc.html USA
Ovh Sas https://myip.ms/view/web_hosting/7593/Ovh_Sas.html France
Hetzner Online Ag https://myip.ms/view/web_hosting/45081/Hetzner_Online_Ag.html Germany
Hostgator.com Llc https://myip.ms/view/web_hosting/26757/Hostgator_com_Llc.html USA
Google Inc https://myip.ms/view/web_hosting/617/Google_Inc.html USA