Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python BeautifulSoup不会使用.find#u ALL(';a';)删除页面中的所有锚定标记。我是不是忽略了什么?_Python_Beautifulsoup_Screen Scraping_Python 3.3 - Fatal编程技术网

Python BeautifulSoup不会使用.find#u ALL(';a';)删除页面中的所有锚定标记。我是不是忽略了什么?

Python BeautifulSoup不会使用.find#u ALL(';a';)删除页面中的所有锚定标记。我是不是忽略了什么?,python,beautifulsoup,screen-scraping,python-3.3,Python,Beautifulsoup,Screen Scraping,Python 3.3,好的,在终端中,在导入并生成必要的对象之后——我键入: 这给了我维基百科页面上的所有链接(大约250个)。没问题 然而,在我正在编写的一个程序中,我只收到大约60个链接(这是同一个维基百科页面),而我得到的链接大多一文不值。我仔细检查了两个变量的初始化是否完全相同——唯一的区别是变量的名称。作为参考,以下是我设置BS4对象并获取所需页面的函数: def get_site(hyperLink): userSite = urllib3.PoolManager() siteData =

好的,在终端中,在导入并生成必要的对象之后——我键入:

这给了我维基百科页面上的所有链接(大约250个)。没问题

然而,在我正在编写的一个程序中,我只收到大约60个链接(这是同一个维基百科页面),而我得到的链接大多一文不值。我仔细检查了两个变量的初始化是否完全相同——唯一的区别是变量的名称。作为参考,以下是我设置BS4对象并获取所需页面的函数:

def get_site(hyperLink):
    userSite = urllib3.PoolManager()
    siteData = userSite.request("GET", hyperLink)
    bsd = BeautifulSoup(siteData.data)
    return bsd
稍后,我抓取这些元素并将它们附加到一个列表中,然后我将对其进行操作:

def find_urls(bsd, urls, currentNetloc):
    for links in bsd.find_all('a'):
        urls.append(links.get('href'))
    return urls
其他相关信息:

  • 我正在使用Python 3.3
  • 我使用的是urlib3、beautifulsoup4和urlparse(来自urlib)
  • 我在PyCharm工作(实际项目)
  • 使用Lubuntu,如果有必要的话
在运行python3的命令行实例并导入“sys”后,我键入并收到:

$ sys.executable
'/usr/bin/python3'
$ sys.path
['', '/usr/local/lib/python3.3/dist-packages/setuptools-1.1.5-py3.3.egg', '/usr/local/lib/python3.3/dist-packages/pip-1.4.1-py3.3.egg', '/usr/local/lib/python3.3/dist-packages/beautifulsoup4-4.3.2-py3.3.egg', '/usr/lib/python3.3', '/usr/lib/python3.3/plat-i386-linux-gnu', '/usr/lib/python3.3/lib-dynload', '/usr/local/lib/python3.3/dist-packages', '/usr/lib/python3/dist-packages']

在Pycharm项目中运行这些命令后,我收到了完全相同的结果,只是列表中包含了包含我的Pycharm项目的目录

这不是我的答案。我是从那里得到的,这以前对我很有帮助

    from bs4 import BeautifulSoup
    import csv

    # Create .csv file with headers
    f=csv.writer(open("nyccMeetings.csv","w"))
    f.writerow(["Name", "Date", "Time", "Location", "Topic"])

    # Use python html parser to avoid truncation
    htmlContent = open("nyccMeetings.html")
    soup = BeautifulSoup(htmlContent,"html.parser")

    # Find each row
    rows = soup.find_all('tr')
    for tr in rows:
        cols = tr.find_all('td') # Find each column
        try:
            names = cols[0].get_text().encode('utf-8')
            date = cols[1].get_text().encode('utf-8')
            time = cols[2].get_text().encode('utf-8')
            location = cols[3].get_text().encode('utf-8')
            topic = cols[4].get_text().encode('utf-8')
       except:
            continue
       # Write to .csv file
       f.writerow([names, date, time, location, topic])
我认为,在编写本脚本时,注意我遇到的一些麻烦会很有用:

指定您的解析器。指定BeautifulSoup将用于通过html树表单进行解析的html解析器的类型非常重要。我读入Python的html文件格式不正确,因此BeautifulSoup截断了html,我只能访问大约四分之一的记录。通过告诉BeautifulSoup显式使用内置的Python html解析器,我能够避免这个问题并检索所有记录


编码为UTF-8。get_text()在编码html标记中的文本时遇到一些问题。因此,我无法将数据写入以逗号分隔的文件。通过明确告诉程序编码到UTF-8,我们完全避免了这个问题。

我在我的网页抓取项目中遇到了很多问题;然而,美丽集团从来不是罪魁祸首

我高度怀疑你和我在维基百科上遇到的问题是一样的。Wikipedia不喜欢我的用户代理,返回的页面与我请求的页面不同。尝试在代码中添加用户代理,例如。
Mozilla/5.0(windowsnt 6.2;WOW64)AppleWebKit/537.36(KHTML,比如Gecko)Chrome/33.0.1750.146 Safari/537.36

您提到您正在使用urllib3,因此您可以在这里阅读如何使用自定义用户代理


此外,如果您想诊断您的问题,请尝试以下操作:在您说一切正常的终端中,添加一行额外的
print len(html)
,然后在程序中执行相同的操作,以查看您是否确实从同一页面获得了链接

你能举一个维基百科页面的例子吗?是的。例如,我做了很多测试。我注意到在终端我得到了一个链接,比如“古希腊”然而,在我的编码项目中,它跳过了这个页面内容中几乎所有的链接,大部分都是普通链接。要仔细检查:终端中使用的解释器和PyCharm使用的intepreter是相同的吗?当我通过py charm运行程序时,缺少刮取的URL。当我说通过终端运行它工作正常时,我指的是一个实际的Linux终端。如果您的问题是关于python的哪个版本,那么是的,我在命令行和Pycharmal中都使用了python 3。因此,对于简短和任何语法错误,我很抱歉,我现在正在打电话。请在这里回答问题。链接可能会失效。
    from bs4 import BeautifulSoup
    import csv

    # Create .csv file with headers
    f=csv.writer(open("nyccMeetings.csv","w"))
    f.writerow(["Name", "Date", "Time", "Location", "Topic"])

    # Use python html parser to avoid truncation
    htmlContent = open("nyccMeetings.html")
    soup = BeautifulSoup(htmlContent,"html.parser")

    # Find each row
    rows = soup.find_all('tr')
    for tr in rows:
        cols = tr.find_all('td') # Find each column
        try:
            names = cols[0].get_text().encode('utf-8')
            date = cols[1].get_text().encode('utf-8')
            time = cols[2].get_text().encode('utf-8')
            location = cols[3].get_text().encode('utf-8')
            topic = cols[4].get_text().encode('utf-8')
       except:
            continue
       # Write to .csv file
       f.writerow([names, date, time, location, topic])