jak*_*888 2 html python web-crawler
我是 python 的新手,我有一个 HTML 文本文件,我想用 python 2.7 抓取它。
下面的代码只是一个公司信息的一个例子。在完整的 html 文本文件中,所有其他公司的代码结构也相同,并且位于彼此下方(如果后者信息有帮助)。
所以基本上,我想按时间顺序提取某些信息(如公司名称、位置、电话号码和网站),以便将数据分配给正确的组织,如下所示:
Liberty Associates LLC | New York | +1 973-344-8300 | www.liberty.edu
Company B | Los Angeles | +1 213-802-1770 | perchla.com
Run Code Online (Sandbox Code Playgroud)
如果我不够简洁,我很抱歉,但任何关于如何启动脚本以及它应该是什么样子的建议都会非常有帮助!
编码:
Liberty Associates LLC | New York | +1 973-344-8300 | www.liberty.edu
Company B | Los Angeles | +1 213-802-1770 | perchla.com
Run Code Online (Sandbox Code Playgroud)
它在网页上的样子:
编辑:
所以在 ajputnam 的帮助下,我现在得到了这个:
from lxml import html
str = open('test_html.txt', 'r').read()
tree = html.fromstring(str)
name = tree.xpath("/html/body/div/div/div[1]/strong/text()")
place = tree.xpath("/html/body/div/div/div[2]/table/tbody/tr[4]/td[1]/label/text()")
phone = tree.xpath("/html/body/div/div/div[2]/table/tbody/tr[6]/td[2]/text()")
url = tree.xpath("/html/body/div/div/div[2]/table/tbody/tr[8]/td[1]/a/text()")
print(name, place, phone, url)
Run Code Online (Sandbox Code Playgroud)
印刷:
(['"Liberty Associates LLC"'], ['New York'], ['+1 973-344-8300'], ['www.liberty.edu'])
Run Code Online (Sandbox Code Playgroud)
但是,当我在整个 html 文件(具有多个公司数据)上尝试此代码时,我得到所有匹配的变量都紧随其后。我如何正确使用 [0] 来获得这样的数据结构?:
Liberty Associates LLC | New York | +1 973-344-8300 | www.liberty.edu
Company B | Los Angeles | +1 213-802-1770 | perchla.com
Run Code Online (Sandbox Code Playgroud)
首先,您需要从页面中获取 HTML。您可以使用诸如请求之类的库来执行此操作。
from lxml import html
import requests
page = requests.get('url')
tree = html.fromstring(page.content)
Run Code Online (Sandbox Code Playgroud)
然后您可以使用选择器访问“树”中的内容。
prices = tree.xpath('//span[@class="item-price"]/text()')
Run Code Online (Sandbox Code Playgroud)
或者您可以正常解析字符串。
请参阅:HTML 抓取
从文件中读取
from lxml import html
# read html as string from file
str = open('file.html', 'r').read()
tree = html.fromstring(str)
company = tree.xpath('//div[@class="card-header"]/strong/text()')
print company
Run Code Online (Sandbox Code Playgroud)