【问题标题】:Website Scraping Specific Forms网站抓取特定表格
【发布时间】:2016-11-21 23:22:24
【问题描述】:

对于一个课外学校项目,我正在学习如何抓取网站。正如您在下面的代码中看到的那样,我可以从一页上刮下一个名为“elqFormRow”的表单。

如何在整个website 上刮掉所有出现的“elqFormRow”?我想将该表单所在位置的 URL 返回到列表中,但是这样做时遇到了麻烦,因为我不知道如何大声笑。

import bs4 as bs
import urllib.request

sauce = urllib.request.urlopen('http://engage.hpe.com/Template_NGN_Convert_EG-SW_Combined_TEALIUM-RegPage').read()

soup = bs.BeautifulSoup(sauce, 'lxml')

for div in soup.find_all('div', class_='elqFormRow'):
    print(div.text.strip())

【问题讨论】:

  • 如果我正确阅读了您的问题,您似乎想要的是蜘蛛。蜘蛛可能很复杂,但一般来说,您可以通过链接搜索页面上的其他链接,从该页面获取您想要的内容,然后按照 url 并重复某些深度/要求。如果您想从urllib.request 获取网址,您可以使用.geturl(),但您不能像现在这样使用您的变量,因为您使用了.read

标签: python web-scraping beautifulsoup


【解决方案1】:

您可以从页面中获取 URL,然后按照它们(大概)抓取整个网站。像这样的东西,这取决于你想从哪里开始以及你想要什么页面需要一点按摩:

import bs4 as bs
import requests

domain = "engage.hpe.com"
initial_url = 'http://engage.hpe.com/Template_NGN_Convert_EG-SW_Combined_TEALIUM-RegPage'

# get urls to scrape
text = requests.get(initial_url).text
initial_soup = bs.BeautifulSoup(text, 'lxml')
tags = initial_soup.findAll('a', href=True)

urls = []
for tag in tags:
    if domain in tag:
        urls.append(tag['href'])
urls.append(initial_url)

print(urls)

# function to grab your info
def scrape_desired_info(url):
    out = []
    text = requests.get(url).text
    soup = bs.BeautifulSoup(text, 'lxml')
    for div in soup.find_all('div', class_='elqFormRow'):
        out.append(div.text.strip())
        return out



info = [scrape_desired_info(url) for url in urls if domain in url]

URLlib 很臭,使用请求。如果您需要在站点中向下访问多个级别,请将 URL 查找部分放在一个函数中并调用它 X 次,其中 X 是您要遍历的链接级别数。

负责任地刮擦。尽量不要陷入巫师学徒的境地,在循环中一遍又一遍地访问站点,或者跟随站点外部的链接。一般来说,我也不会提出您要抓取的页面的问题。

【讨论】:

  • 啊,感谢您提供这个有趣的见解。有任何机会,您会收到回溯错误吗?我收到了File "C:\Users\Jeremy\AppData\Local\Programs\Python\Python35-32\l‌​ib\site-packages\bs4‌​\__init__.py", line 192, in __init__ elif len(markup) <= 256 and ( TypeError: object of type 'Response' has no len()
  • 我没有将您使用 response.get() 获得的响应对象转换为字符串。我将 .text() 方法添加到上面的响应对象中,代码应该可以工作。请记住,该代码只会从第一页(initial_url)获取链接,因此您必须在后续页面上运行 get url 代码才能获得更多级别。
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多