【问题标题】:please help me in lxml请在 lxml 中帮助我
【发布时间】:2014-09-14 07:54:56
【问题描述】:

我在使用 lxml 进行抓取时遇到了一些问题 我刚刚编写了一个运行良好的代码,但我有两个问题

  1. 我希望姓名和地址在同一行,每个条目都应该在不同的行中

    name1,adress1
    name2,adress2
    

我不需要数据中的任何方括号

  1. 我必须输入 500 个代码,所以我想从外部文本/csv 文件中导入它 请帮我看看我该怎么做

import lxml.html as lh

from selenium import webdriver

browser = webdriver.Firefox()

from lxml import html


for cod in ("35211","36116","36542"):

     browser.get('http://kmbsapps.konicaminolta.us/wheretobuy/main_search.jspx?productCategory=Office+Systems&sl_zip='+cod)

     content = browser.page_source

     tree = lh.fromstring(content)

     name=tree.xpath('//tr/td/span[@class="largecol"]/text()')

     adress=tre.xpath('//tr/td/span[@class="smallcol"]/text()')


     print(name,adress)

【问题讨论】:

  • text/csv 长什么样子?
  • 它在列中的excel中
  • 我的意思是:有哪些列?
  • csv 文件类似于 36116 36542 36693 35630 35802 35805 85719 85713 85040 85281 86301 72703
  • 很难在评论中说出它是什么。它们是单行数字(没有标题)吗?

标签: python selenium web-scraping lxml


【解决方案1】:

您不需要使用lxmlselenium 确实提供了find_elements_by_xpath

使用zip 匹配姓名和地址。

打开文本文件并迭代获取行;使用str.strip获取验证码。


from selenium import webdriver

browser = webdriver.Firefox()
url = 'http://kmbsapps.konicaminolta.us/wheretobuy/main_search.jspx?productCategory=Office+Systems&sl_zip='

with open('1.txt') as f:
    for line in f:
        cod = line.strip()
        browser.get(url+cod)
        name = browser.find_elements_by_xpath('//tr/td/span[@class="largecol"]')
        address = browser.find_elements_by_xpath('//tr/td/span[@class="smallcol"]')
        name = [n for n in name if n.text.strip()]  # Remove empty names
        for n, a in zip(name, address):
            print(n.text, a.text)

如果你想要的不受javascript影响,你可以只使用lxml

import lxml.html

url = 'http://kmbsapps.konicaminolta.us/wheretobuy/main_search.jspx?productCategory=Office+Systems&sl_zip='

with open('1.txt') as f:
    for line in f:
        cod = line.strip()
        tree = lxml.html.parse(url+cod)
        name = tree.xpath('//tr/td/span[@class="largecol"]/text()')
        address = tree.xpath('//tr/td/span[@class="smallcol"]/text()')
        name = [n for n in name if n.strip()]
        for n, a in zip(name, address):
            print(n, a)

【讨论】:

  • 我会在单独的行中得到结果
  • @user3891081,是的,你会的。请自己尝试。我给了你工作代码。
  • 我仍然没有在单独的行中获取数据
  • 这是结果 3.1 英里 660 University Boulevard, Suite H Birmingham, AL 35233 AMERI-TEK 2814 Linden Avenue Birmingham, AL 35209 4.0 英里 1101 Greenwood Crossing Court Bessemer, AL 35022 DEX IMAGING OF ALABAMA, LLC 6205 AL Highway 69 Guntersville, AL 35976 9.8 英里 3240 Leeman Ferry Road Huntsville, AL 35801 KONICA MINOLTA BUSINESS SOLUTIONS U.S.A., INC. 1523 South Broad Street Scottsboro, AL 35233
  • @user3891081,你能把它发到别的地方吗(像pastebin这样的网站)?看评论很难判断有没有换行符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2021-09-24
  • 1970-01-01
  • 2010-10-24
  • 2013-04-11
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多