【发布时间】:2016-08-31 19:59:23
【问题描述】:
我正在尝试从多个网页中抓取数据以创建数据的 CSV。数据只是产品的营养信息。我已经生成了访问该网站的代码,但是我不能完全让代码正确地迭代出来。问题是,该网站使用 DIV 标签作为产品名称,并且在 DIV 内部 或 ,它在页面之间有所不同。当我尝试迭代它时,产品名称会立即显示在一个带有标签的列表中,然后我得到我请求的列的内容,没有标签。我试图弄清楚我做错了什么。
源代码示例:
<div><strong>Product 1 Name</strong></div>
<table>
<tbody>
<tr>
<td>Serving Size</td>
<td>8 (fl. Oz.)</td>
</tr>
<tr>
<td>Calories</td>
<td>122 Calories</td>
</tr>
<tr>
<td>Fat</td>
<td>0 (g)</td>
</tr>
<tr>
<td>Sodium</td>
<td>0.2 (mg)</td>
</tr>
<tr>
<td>Carbs</td>
<td>8.8 (mg)</td>
</tr>
<tr>
<td>Dietary Fiber</td>
<td>0 (g)</td>
</tr>
<tr>
<td>Sugar</td>
<td>8.8 (g)<br />
</td>
</tr>
</tbody>
</table>
<div><strong>Product 2 Name</strong></div>
<table>
<tbody>
<tr>
<td>Serving Size</td>
<td>8 (fl. Oz.)</td>
</tr>
<tr>
<td>Calories</td>
<td>134 Calories</td>
</tr>
<tr>
<td>Fat</td>
<td>0 (g)</td>
</tr>
<tr>
<td>Sodium</td>
<td>0.0 (mg)</td>
</tr>
<tr>
<td>Carbs</td>
<td>8.4 (mg)</td>
</tr>
<tr>
<td>Dietary Fiber</td>
<td>0 (g)</td>
</tr>
<tr>
<td>Sugar</td>
<td>8.4 (g)<br />
</td>
</tr>
</tbody>
</table>
理想情况下,我希望能够输出到标题行中包含“产品名称”和第 1 列数据的 CSV,因为它对于所有表都是相同的。然后数据行将如下所示:
"Product 1 Name, 8, 112, 0, 0.2, 8.8, 0, 8.8"
我知道需要对数据进行一些操作以使其达到该点(以删除大小信息)。
这是我目前所拥有的让我发疯的东西:
import requests, bs4, urllib2, csv
from bs4 import BeautifulSoup
from collections import defaultdict
#Loop on URLs to get Nutritional Information from each one.
with open('NutritionalURLs.txt') as f:
for line in f:
r = requests.get('website' + line)
soup=BeautifulSoup(r.text.encode('ascii','ignore'),"html.parser")
#TESTING
with open('output.txt', 'w') as o:
product_list = soup.find_all('b')
product_list = soup.find_all('strong')
print(product_list)
table_list = soup.find_all('table')
for tables in table_list:
trs = tables.find_all('tr')
for tr in trs:
tds = tr.find_all('td')[1:]
if tds:
facts = tds[0].find(text=True)
print(facts)
# o.write("Serving Size: %s, Calories: %s, Fat: %s, Sodium: %s, Carbs: %s, Dietary Fiber: %s, Sugar: %s\n" % \
# (facts[0].text, facts[1].text, facts[2].text, facts[3].text, facts[4].text, facts[5].text, facts[6].text))
这给了我这样的输出:
[<strong>Product 1 Name</strong>, <strong>Product 2 Name</strong>]
8 (fl. Oz.)
101 Calories
0 (g)
0.0 (mg)
0 (mg)
0 (g)
0 (g)
8 (fl. Oz.)
101 Calories
0 (g)
0.0 (mg)
0 (mg)
0 (g)
0 (g)
[]
【问题讨论】:
标签: python html web-scraping beautifulsoup