爬虫:在Python 3.5中将存储为图片的数据添加到CSV文件中

3
对于此项目,我正在从数据库中获取数据,并尝试将这些数据导出到电子表格以供进一步分析。(之前在这里发布过--感谢那边重新编写我的代码的帮助!)
我之前认为在表格中找到获胜者可以简化为始终选择在表格中出现的第一个名字,因为我认为“获胜者”始终出现在第一位。然而,情况并非如此。
无论候选人是否当选,都以图片的形式存储在第一列中。我该如何抓取并存储在电子表格中?
它位于<td headers>下:
<img src="/WPAPPS/WPR/Content/Images/selected_box.gif" alt="contestant won this nomination contest">

我的问题是:如何使用BeautifulSoup解析HTML表格并从第一列中提取一个值,该值以图像而非文本形式存储在表格中。

我想尝试一些布尔排序措施的想法,但我不确定如何实现。

我的代码如下:

from bs4 import BeautifulSoup
import requests
import re
import csv


url = "http://www.elections.ca/WPAPPS/WPR/EN/NC?province=-1&distyear=2013&district=-1&party=-1&pageno={}&totalpages=55&totalcount=1368&secondaryaction=prev25"
rows = []

for i in range(1, 56):
    print(i)
    r  = requests.get(url.format(i))
    data = r.text
    cat = BeautifulSoup(data, "html.parser")
    links = []

    for link in cat.find_all('a', href=re.compile('selectedid=')):
        links.append("http://www.elections.ca" + link.get('href'))  

    for link in links:
        r  = requests.get(link)
        data = r.text
        cat = BeautifulSoup(data, "html.parser")
        lspans = cat.find_all('span')
        cs = cat.find_all("table")[0].find_all("td", headers="name/1")        
        elected = []

        for c in cs:
            elected.append(c.contents[0].strip())

        rows.append([
            lspans[2].contents[0], 
            lspans[3].contents[0], 
            lspans[5].contents[0],
            re.sub("[\n\r/]", "", cat.find("legend").contents[2]).strip(),
            re.sub("[\n\r/]", "",  cat.find_all('div', class_="group")[2].contents[2]).strip().encode('latin-1'),
            len(elected),
            cs[0].contents[0].strip().encode('latin-1')
            ])

with open('filename.csv', 'w', newline='') as f_output:
   csv_output = csv.writer(f_output)
   csv_output.writerows(rows)

真的,任何提示都将非常感激。非常感谢。


请问有什么问题吗? - Rafael Almeida
@Rafael,我在帖子中澄清了问题。我在这里复制了它: 我该如何使用BeautifulSoup解析HTML表格并从第一列中提取一个值,该值以图像而不是文本的形式存储在表格中? - HowenWilson
我们需要看到这张表格,在你的代码中提供的URL在页面上复制了这个错误:错误:搜索条件无效。请尝试选择新的搜索条件。 - Rafael Almeida
代码中的URL被修改为一对花括号,以便可以循环遍历所有56个页面。这里是其中一个表格的示例。第一列是相关的列。 - HowenWilson
1个回答

2
这段代码将会输出被选中人的姓名:
from bs4 import BeautifulSoup
import requests
req  = requests.get("http://www.elections.ca/WPAPPS/WPR/EN/NC/Details?province=-1&distyear=2013&district=-1&party=-1&selectedid=8548")
page_source = BeautifulSoup(req.text, "html.parser")
table = page_source.find("table",{"id":"gvContestants/1"})
for row in table.find_all("tr"):
    if not row.find("img"):
        continue
    if "selected_box.gif" in row.find("img").get("src"):
        print(''.join(row.find("td",{"headers":"name/1"}).text.split()))

顺便提一下,请不要使用没有意义的变量名进行声明,这会让帮助你的人感到眼花,并且当你再次查看代码时也会对你造成影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接