我想刮掉IEEE资源管理器来提取论文和作者的名单。现在的问题是下面的代码首先返回作者的名字,然后返回论文列表,但在网页中内容的顺序不是这样的。我不知道为什么会这样???
import requests
page = requests.get('http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=7109453&rowsPerPage=100')
import bs4
soup = bs4.BeautifulSoup(page.content)
names = soup.select('.prefNameLink , .art-abs-url span')
for index, name in enumerate(names):
print name.text.strip()
答案 0 :(得分:0)
使用.prefNameLink, .art-abs-url span
之类的a group of selectors时,所选元素的顺序无法保证与它们在文档中的显示顺序相匹配。如您的示例所示,首先选择所有.prefNameLink
元素然后再次解析整个文档并选择所有.art-abs-url span
元素。
解决此问题的最简单方法是迭代每个容器元素然后检索该容器中的每个相应名称。
这样做时,文档只被解析一次并且为每个组维护订单:
for container in soup.select('.results > li'):
for name in container.select('.prefNameLink, .art-abs-url span'):
print name.text.strip()
然而,由于每篇论文可能有多位作者,因此更好的方法是针对每篇论文迭代每位作者。
这样做,订单也将保留在每个容器中:
for container in soup.select('.results > li'):
for paper in container.select('.art-abs-url span'):
print paper.text.strip()
for author in container.select('.prefNameLink'):
print author.text.strip()