可以将 xpath 直接复制并粘贴到漂亮的汤解析器中,还是必须对其进行修改?

Can xpaths be copied and pasted directly into beautiful soup parsers, or must they be modified?

我想从 this 网页中提取 PMID(即数字“23410195”)。

我通过查看页面源代码获得了 firefox 中的 xpath,右键单击我想要的元素,然后单击粘贴 xpath,进入此代码:

import pandas as pd
import requests
import lxml
from lxml import etree
from lxml import html
import requests
from bs4 import BeautifulSoup as bs
output_file = open('neuropep.txt', 'a')
from urllib.request import urlopen

for i in range(1,2):
#       try:
                number = '{:05}'.format(i)
                url = 'http://isyslab.info/NeuroPep/search_info?pepNum=NP' + str(number)
                response = urlopen(url)
                htmlparser = etree.HTMLParser()
                tree = etree.parse(response,htmlparser)
                var = tree.xpath('/html/body/div/div[3]/table/tbody/tr[14]/td[2]/ol/li/p/span/a')
                print(var)

但是输出只是一个空列表?

我尝试了其他一些不成功的方法:例如

               content = requests.get(url)
               soup = bs(content.content,'lxml')
               /html/body/div/div[3]/table/tbody/tr[14]/td[2]/ol/li/p/span/a
               table = soup.find_all('table')
               print(table[0])

我只是想知道这里有什么?具体来说,为什么当我复制并粘贴一个元素的xpath时,为什么输出是一个空列表?

您不需要指定绝对 xpath。使用相对 xpath 来识别 PMID。 在这个特定的网站中,他们通过将 PMID 包含在 span

中来简化操作

你可以试试 .//span[@id='pmid']/a

如果您右键单击该页面并选择 select "view page source" 选项,您将看到您要查找的内容是动态显示的还是原始显示的 html 页面源,最重要的是它是否从那里开始。在这种情况下,数字不在 html 中,但它在脚本标记中可用。所以你必须相应地调整你的逻辑。

pmid通过Javascript注入页面。

可以使用selenium解压,或者re模块:

import re
import requests

url = 'http://isyslab.info/NeuroPep/search_info?pepNum=NP00001'

m = re.findall(r"var reference = String\('(\d+)", requests.get(url).text)

if m:
    print(m[0])

打印:

23410195