使用BeautifulSoup和dataframe迭代搜寻多个页面

时间:2018-11-11 16:39:44

标签: python dataframe web-scraping beautifulsoup

我正在使用BeautifulSoup从多个URL抓取。通过附加我已保存在数据框中的变量(postcode_URL)来对URL进行迭代。

代码在行table_rows = table.find_all('tr')处中断,并抛出错误:'NoneType'对象没有属性'find_all'

有趣的是,如果我删除迭代并在URL中手动输入单个邮政编码,则代码可以完美地工作,因此,我相信这一定与迭代循环有关。

下面是我使用的代码。有什么想法吗?

scraped_data = []

for x, row in postcodes_for_urls.iterrows():
    page = requests.get("http://myurl"+(row['postcode_URL']))
    soup = BeautifulSoup(page.content, 'html.parser')
    table = soup.find('table')
    table_rows = table.find_all('tr')
    for tr in table_rows:
        td = tr.find_all('td')
        row = [tr.text for tr in td]
        scraped_data.append(row)

pd.DataFrame(scraped_data, columns=["A", "B", "C"])

2 个答案:

答案 0 :(得分:0)

我调查了这个问题,并在笔记本电脑上尝试了几段。

问题不在于 DataFrame ,因为您一次读取循环中的每一行,问题在于URL,您的程序正确地抓取了包含表的页面并抛出没有元素的邮政编码网址错误。

考虑第一个测试:

我创建了一个没有表格的HTML页面:

 <html>
  <head>
     <title>Demo page</title>
  </head>

  <body>
     <h2>Demo without table</h2>
  </body>
</html>

然后我执行了如下的python代码:

from bs4 import BeautifulSoup
data = open('table.html').read()
parser = BeautifulSoup(data, 'html.parser')
table = parser.find('table')
rows = table.find_all('tr')
print(rows)

由于 NoneType异常,上面的代码停止了,因为 parser.find()返回了一个 NoneType对象(如果在html中找不到表元素)数据。因此 find_all()不是NoneType对象的方法,因此会引发错误。

所以我如下更改了HTML代码:

<html>
<head>
    <title>Demo page</title>
</head>

<body>
    <h2>Demo without table</h2>
    <table>
        <tr>Demo</tr>
    </table>
</body>
</html>

现在python代码可以正常工作,因为存在表元素。

所以结论:

例外是因为DataFrame中的邮政编码之一导致了不包含表的URL。因此,我建议您对代码进行一些小的更改:

scraped_data = []

for x, row in postcodes_for_urls.iterrows():
  page = requests.get("http://myurl"+(row['postcode_URL']))
  soup = BeautifulSoup(page.content, 'html.parser')
  table = soup.find('table')
  #add this :
  if table == None :
      continue

  table_rows = table.find_all('tr')
  for tr in table_rows:
    td = tr.find_all('td')
    row = [tr.text for tr in td]
    scraped_data.append(row)

pd.DataFrame(scraped_data,columns = [“ A”,“ B”,“ C”])

答案 1 :(得分:0)

您需要做的就是检查<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p>Type in your name</p> <input type="text" id="txtName"> <p>Enter a number 1-20.</p> <input type="text" id="txtNmr"> <input type="button" value="Greet Me!" onclick="greetMe()"> <hr> <div id="greetings"> <!-- Section to output the greeting --> </div> <div id="errors"> <!-- Section to output the greeting --> </div>是否为空并且不为空,请尝试下面的代码。您也可以放置table_rows之类的exception handlertry语句,以获取最佳实践。它总是因为空行或由于您正在抓取的真实页面上的异常模式而中断。

catch