我试图从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
的信息?
答案 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