gpt4 book ai didi

python - 使用 Python 3 从动态 HTML 表中提取数据

转载 作者:行者123 更新时间:2023-12-04 04:05:20 24 4
gpt4 key购买 nike

我一直在使用 python 3 脚本来生成 BibTeX 条目,并且有 ISSN's我想用它来获取有关相关期刊的信息。

例如,我想使用 ISSN 0897-4756发现这是Chemistry of Materials期刊,由 ACS Publications 出版.

我可以使用 this site 手动完成此操作,我要查找的信息存储在 lxml 表中 //table[@id="journal-search-results-table"] ,或者更具体地说,在其表体的单元格中。

但是,我无法使用 python 3.x 成功实现自动化

我尝试使用 httplib2 中的方法访问数据, requests , urllib2 , 和 lxml.html包,到目前为止没有成功。

我目前的情况如下所示:

import certifi       
import lxml.html
import urllib.request

ISSN = "0897-4756"
address = "https://www.journalguide.com/journals/search?type=journal-name&journal-name={}".format(ISSN)

hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}

request = urllib.request.Request(address,None,hdr) #The assembled request
response = urllib.request.urlopen(request)
html = response.read()
tree = lxml.html.fromstring(html)

print(tree.xpath('//table[@id="journal-search-results-table"]/text()'))
# >> ['\n', '\n']
# Shows that I am connecting to the table

print(tree.xpath('//table[@id="journal-search-results-table"]//td/text()'))
# >> []
# Should???? hold the data segments that I am looking for?

Exact page being queryed by the above

据我所知,表格的 tbody 似乎是元素,因此是 trtd它包含的元素在 python 解释 HTML 时没有被加载——这相应地阻止了我读取数据。

如何才能从上面指定的表格中读出期刊名称和出版商?

最佳答案

就像您在问题中提到的那样,此表通过 javascript 动态更改。要解决这个问题,您实际上必须使用以下方法呈现 javascript:

  • 网络驱动程序,如 selenium它以用户看到的方式模拟网站(通过呈现 javascript)
  • requests-html ,这是一个相对较新的模块,允许您在网页上呈现 javascript 并且具有许多其他用于网络抓取的惊人功能

这是使用 requests-html 解决问题的一种方法:

from requests_html import HTMLSession

ISSN = "0897-4756"
address = "https://www.journalguide.com/journals/search?type=journal-name&journal-name={}".format(ISSN)

hdr = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'
}

ses = HTMLSession()
response = ses.get(address, headers=hdr)
response.html.render() # render the javascript to load the elements in the table
tree = response.html.lxml # no need to import lxml.html because requests-html can do this for you

print(tree.xpath('//table[@id="journal-search-results-table"]/text()'))
# >> ['\n', '\n']

print(tree.xpath('//table[@id="journal-search-results-table"]//td/text()'))
# >> ['ACS Publications', '1.905', 'No', '\n', '\n', '\n']

关于python - 使用 Python 3 从动态 HTML 表中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62595606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com