【发布时间】:2015-10-05 02:42:12
【问题描述】:
我正在从目录中抓取按摩治疗师的姓名及其地址。整个字符串的地址都保存在 CSV 中的一列中,但每个治疗师的标题/姓名每列保存一个单词,超过 2 或 3 列。
我需要做什么才能将提取的字符串保存在一列中,就像保存地址一样? (前两行代码是页面中的示例 html,下一组代码是针对此元素的脚本的摘录)
<span class="name">
<img src="/images/famt-placeholder-sm.jpg" class="thumb" alt="Tiffani D Abraham"> Tiffani D Abraham</span>
import mechanize
from lxml import html
import csv
import io
from time import sleep
def save_products (products, writer):
for product in products:
for price in product['prices']:
writer.writerow([ product["title"].encode('utf-8') ])
writer.writerow([ price["contact"].encode('utf-8') ])
writer.writerow([ price["services"].encode('utf-8') ])
f_out = open('mtResult.csv', 'wb')
writer = csv.writer(f_out)
links = ["https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY","https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=2&PageSize=10","https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=3&PageSize=10","https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=4&PageSize=10","https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=5&PageSize=10","https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=6&PageSize=10","https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=7&PageSize=10", "https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=8&PageSize=10", "https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=9&PageSize=10", "https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY&PageIndex=10&PageSize=10" ]
br = mechanize.Browser()
for link in links:
print(link)
r = br.open(link)
content = r.read()
products = []
tree = html.fromstring(content)
product_nodes = tree.xpath('//ul[@class="famt-results"]/li')
for product_node in product_nodes:
product = {}
price_nodes = product_node.xpath('.//a')
product['prices'] = []
for price_node in price_nodes:
price = {}
try:
product['title'] = product_node.xpath('.//span[1]/text()')[0]
except:
product['title'] = ""
try:
price['services'] = price_node.xpath('./span[2]/text()')[0]
except:
price['services'] = ""
try:
price['contact'] = price_node.xpath('./span[3]/text()')[0]
except:
price['contact'] = ""
product['prices'].append(price)
products.append(product)
save_products(products, writer)
f_out.close()
【问题讨论】:
-
请将您的部分数据添加到您的问题中,这样会更容易理解您的意思。
-
@LetzerWille 这是我从中提取的页面:
https://www.amtamassage.org/findamassage/results.html?match=exact&l=NY- 生成的 csv 是每个治疗师 3 行,顺序从姓名、地址、专业递减。地址和专业只保存在 A 列中,但名称分布在 B、C 和 D 列中,每列一个单词。我现在已经发布了整个脚本。 -
我意识到问题在于
product["title"]的数据是字符串而不是列表(与services和contact的数据不同,它们都是列表)。我知道我需要更改一些导致它期望列表而不是字符串的内容,但我不确定需要调整代码的哪一部分。
标签: python csv web-scraping