【发布时间】:2017-08-26 07:50:40
【问题描述】:
我正在编写一个解决方案来测试 Python 中的this 现象。我已经完成了大部分逻辑,但是在跟踪 Wikipedia 文章中的链接时会出现许多边缘情况。
我遇到的问题出现在像this 这样的页面上,其中第一个<p> 具有多个级别的子元素,并且需要提取第一组括号之后的第一个<a> 标记。在这种情况下,(要提取this link),您必须跳过括号,然后到达下一个锚标记/href。在大多数文章中,我的算法可以跳过括号,但是由于它在括号前查找链接(或者如果它们不存在),它会在错误的位置找到锚标记。具体来说,这里:<span style="font-size: small;"><span id="coordinates"><a href="/wiki/Geographic_coordinate_system" title="Geographic coordinate system">Coordinates</a>
该算法通过迭代第一个段落标签中的元素(在文章的主体中),迭代地对每个元素进行字符串化,并首先检查它是否包含'('或'
是否有任何直接的方法可以避免嵌入锚标记,而只采用第一个链接,该链接是第一个 <p> 的直接子节点?
下面是带有此代码的函数供参考:
**def getValidLink(self, currResponse):
currRoot = BeautifulSoup(currResponse.text,"lxml")
temp = currRoot.body.findAll('p')[0]
parenOpened = False
parenCompleted = False
openCount = 0
foundParen = False
while temp.next:
temp = temp.next
curr = str(temp)
if '(' in curr and str(type(temp)) == "<class 'bs4.element.NavigableString'>":
foundParen = True
break
if '<a' in curr and str(type(temp)) == "<class 'bs4.element.Tag'>":
link = temp
break
temp = currRoot.body.findAll('p')[0]
if foundParen:
while temp.next and not parenCompleted:
temp = temp.next
curr = str(temp)
if '(' in curr:
openCount += 1
if parenOpened is False:
parenOpened = True
if ')' in curr and parenOpened and openCount > 1:
openCount -= 1
elif ')' in curr and parenOpened and openCount == 1:
parenCompleted = True
try:
return temp.findNext('a').attrs['href']
except KeyError:
print "\nReached article with no main body!\n"
return None
try:
return str(link.attrs['href'])
except KeyError:
print "\nReached article with no main body\n"
return None**
【问题讨论】:
标签: python html dom web-scraping beautifulsoup